题面

补题链接

7
5 6 7 1 2 3 3

13

5
30 50 10 30 70

8

题解

存在欧拉回路的条件是:1. 每个点的度数都是偶数。2. 有边的连通块最多一个。

数据范围是允许我们

n

2

n^2

n2 枚举的,因此我们看怎么均摊

O

(

1

)

O(1)

O(1) 解决上面的两个判断。

首先,每个点的度数都是偶数。我们预处理两个 0/1 数组,

p

r

e

[

i

]

[

j

]

pre[i][j]

pre[i][j] 表示只考虑前

i

i

i 个数,第

j

j

j 个数向后连边个数取模 2 的结果,

s

u

f

[

i

]

[

j

]

suf[i][j]

suf[i][j] 表示只考虑后

n

i

+

1

n-i+1

n−i+1 个数,第

j

j

j 个数向前连边个数取模 2 的结果。

这两个数组都可以

O

(

n

2

)

O(n^2)

O(n2) 预处理出来,用 bitset 可以省点空间。然后,一个区间

[

l

,

r

]

[l,r]

[l,r] 满足度数需求,当且仅当数列

p

r

e

[

r

]

pre[r]

pre[r] 异或数列

s

u

f

[

l

]

suf[l]

suf[l] 后,

[

l

,

r

]

[l,r]

[l,r] 以内全为 0 。异或后为 0,等价于相等。因此我们分别把

p

r

e

[

r

]

pre[r]

pre[r] 和

s

u

f

[

l

]

suf[l]

suf[l] 的

[

l

,

r

]

[l,r]

[l,r] 区间子序列哈希下来,

O

(

1

)

O(1)

O(1) 比较。安排一下枚举顺序,处理全部可以达到

O

(

n

2

)

O(n^2)

O(n2) 。

第二个条件,不太好办。但是我们可以发现一个规律:

  • 只要存在两条边

    a

    c

    ,

    b

    d

    a-c~,~b-d

    a−c , b−d ,且满足

    a

    <

    b

    <

    c

    <

    d

    a<b<c<d

    a<b<c<d ,那么

    a

    ,

    b

    ,

    c

    ,

    d

    a,b,c,d

    a,b,c,d 一定是连通的。

证明很简单,归纳

b

b

b 和

c

c

c 数字的大小关系,会发现不论如何

a

b

a-b

a−b 和

b

c

b-c

b−c 中有至少一条边存在。

所以,一段区间

[

l

,

r

]

[l,r]

[l,r] 满足第二个条件,当且仅当存在一个分界点

i

[

l

,

r

)

i\in [l,r)

i∈[l,r) ,满足点

i

i

i 前面有边,后面有边,但没有边跨过

i

i

i 和

i

+

1

i+1

i+1 的中间线。

我们固定左端点,右端点往右枚举,大力讨论,维护最靠左的一个最大区间

[

L

,

R

]

[

l

,

r

]

[L,R]\sube [l,r]

[L,R]⊆[l,r] ,满足

[

L

,

R

]

[L,R]

[L,R] 以内都是分界点(暂假设后面都有边)。我们得提前处理出

p

t

[

i

]

[

j

]

pt[i][j]

pt[i][j] ,表示

[

j

,

i

)

[j,i)

[j,i) 以内最靠左的位置,满足与

i

i

i 有边相连,没有则为

+

+\infty

+∞。这个可以

O

(

n

2

)

O(n^2)

O(n2) 预处理。

维护

[

L

,

R

]

[L,R]

[L,R] 讨论如下:当枚举到

r

r

r 时,令

l

f

=

p

t

[

r

]

[

l

]

lf=pt[r][l]

lf=pt[r][l]

  1. l

    f

    >

    r

    lf>r

    lf>r ,若区间为空,且前面出现过边,则赋值

    [

    L

    ,

    R

    ]

    :

    =

    [

    r

    1

    ,

    r

    ]

    [L,R]:=[r-1,r]

    [L,R]:=[r−1,r],否则如果

    R

    =

    r

    1

    R=r-1

    R=r−1 ,则

    R

    :

    =

    R

    +

    1

    R:=R+1

    R:=R+1 。

  2. l

    f

    <

    r

    lf<r

    lf<r ,将右端点

    R

    R

    R 尽量左移,

    R

    :

    =

    min

    (

    R

    ,

    l

    f

    1

    )

    R:=\min(R,lf-1)

    R:=min(R,lf−1) ,此时若

    L

    >

    R

    L>R

    L>R(即区间为空),则赋值

    [

    L

    ,

    R

    ]

    :

    =

    [

    r

    ,

    r

    ]

    [L,R]:=[r,r]

    [L,R]:=[r,r] 。

如果

[

L

,

R

]

[L,R]

[L,R] 为空,或者

R

=

r

R=r

R=r ,则子序列

[

l

,

r

]

[l,r]

[l,r] 满足第二个条件。时间复杂度

O

(

n

2

)

O(n^2)

O(n2) 。

CODE

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<ctime>
#include<queue>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 8005
#define LL long long
#define DB double
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
#define FI first
#define SE second
#define SI(x) set<x>::iterator
#define BI bitset<MAXN>
#define eps (1e-9)
LL read() {
LL f=1,x=0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f*x;
}
void putpos(LL x) {
if(!x) return ;
putpos(x/10); putchar('0'+(x%10));
}
void putnum(LL x) {
if(!x) putchar('0');
else if(x < 0) putchar('-'),putpos(-x);
else putpos(x);
}
const int MOD = 998344353;
const int bt = 23;
int n,m,s,o,k;
int a[MAXN];
BI pre[MAXN],suf[MAXN],f1[MAXN];
int pt[MAXN][MAXN];
int hs[MAXN],po[MAXN];
int main() {
n = read();
po[0] = 1;
for(int i = 1;i <= n;i ++) {
a[i] = read();
po[i] = po[i-1] *1ll* bt % MOD;
}
for(int i = 1;i <= n;i ++) {
pt[i][i+1] = n+2;
for(int j = i;j > 0;j --) {
pt[i][j] = pt[i][j+1];
if(a[j] < a[i]) pt[i][j] = j,pre[i][j] = 1;
}
pre[i] ^= pre[i-1];
}
for(int i = n;i > 0;i --) {
for(int j = i;j <= n;j ++) {
if(a[j] > a[i]) {
suf[i][j] = 1;
}
hs[j] = (hs[j] *1ll* bt % MOD + (int)pre[j][i]+2) % MOD;
}
suf[i] ^= suf[i+1];
int has = 0;
for(int j = i;j <= n;j ++) {
(has += ((int)suf[i][j]+2) *1ll* po[j-i] % MOD) %= MOD;
if(has == hs[j]) f1[i][j] = 1;
}
}
int ans = 0;
for(int i = 1;i <= n;i ++) {
int l = n+3,r = n+2;
for(int j = i;j <= n;j ++) {
int lf = pt[j][i];
if(lf > j) {
if(l > r || (l == i-1 && r != j-1)) l = j-1,r = j;
else if(r == j-1) r = j;
}
else {
r = min(r,lf-1);
if(l > r || l == i-1) l = r = j;
}
if(l > r || r == j || l < i) {
ans += (int)f1[i][j];
}
}
}
printf("%d\n",ans);
return 0;
}

后记

好家伙,居然是普及组比赛

3:18:51 过 T3,我还有救吗

学军中学第三届“图灵杯”趣味网络邀请赛——中级T4.欧拉回路 (图论,哈希)的更多相关文章

  1. NOIP2018学军中学游记(11.09~11.11)

    前言 这篇博客记录的是我在\(NOIP2018\)提高组比赛中的经历. 这一次的\(NOIP\)是在学军中学举办的, 莫名感到一阵慌张. 但愿能有一个好成绩,不然就要\(AFO\)了... ... 说 ...

  2. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作

    [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 目录 [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 0x00 摘要 0x01 业务领域 1.1 SOFARegis ...

  4. 给大一的学弟学妹们培训java web的后台开发讨论班计划

    蓝旭工作室5月大一讨论班课程计划   课时 讨论班性质 讨论班名称 主要内容 主讲人   第一讲 先导课 后台开发工具的使用与MySQL数据库基础 后台开发工具的基本使用方法与工程的创建,MySQL数 ...

  5. Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)A蔡老板的会议

    题目描述 图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会.综合楼有N (1<=N<=1000)间办公室,编号1~N每个办公室有一个部长在工(mo)作(yu),其中X号是蔡老板的办 ...

  6. 第三届蓝桥杯 c/c++真题

    第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...

  7. 11th 回忆整个学期——告学弟学妹

    告诉后来的学弟学妹,不要因为艰难而却步,坚持下去才知道,山的对面是什么.很多东西或许一开始看起来是无用,甚至无意义的,但是努力去做,你才知道价值所在.不要等一切结束了,才懂得自己错过了什么.

  8. 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 取球博弈

    2012年第三届蓝桥杯C/C++程序设计本科B组省赛 取球博弈 题目描述 **取球博弈 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并 ...

  9. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

随机推荐

  1. c++ 树状数组

    关于树状数组 树状数组,即 Binary Indexed Tree ,主要用于维护查询前缀和 属于 log 型数据结构 和线段树比较 都是 log 级别 树状数组常数.耗费的空间.代码量都比线段树小 ...

  2. spring源码解析:元注解功能的实现

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  3. 适配抖音!三角面转换和3d模型体量减小,轻量化一键即可完成!

    抖音3d特效,可谓是越来越火爆了,这个有着迪士尼画风的3D大眼,就刷屏了国内外用户的首页! 有人好奇这些特效究竟是怎么制作的?其实就是把3D模型调整适配到头部模型上,调整位置或者大小就可以制作出一个简 ...

  4. 面试突击60:什么情况会导致 MySQL 索引失效?

    为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...

  5. Cron表达式(七子表达式)

    一.七子含义 秒 分 时 日 月 周 年 可用的值 0~59 0~59 0~23 1~31 112(JANDEC) 17(SUNSAT) 1970~2099 可用的通配符 , - * / , - * ...

  6. Oracle数据库常用查询语句

    1.[oracle@dbserver ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Tue Mar 15 15:1 ...

  7. 等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类

    资源类:包子类 设置包子的属性 皮 陷 包子的状态:有 true 没有 false public class BaoZi { //皮 String pi; //陷 String xian; //包子的 ...

  8. 智能指针思想实践(std::unique_ptr, std::shared_ptr)

    1 smart pointer 思想 ​ 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ​ ...

  9. CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解

    前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...

  10. xxljob安装

    目录 一.简介 二.docker安装 三.k8s方式安装 四.参考 一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家 ...