F - Permutation

思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个,

所以可以转换成,x+k, x-k在到x所在位置的时候是否都出现,或者都不出现,即出现情况相等,我们可以

用线段树维护hash值的方式来判断所有x+k,  x-k的出现情况是否都一样。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define PLI pair<LL, int>
#define ull unsigned long long
using namespace std; const int N = 3e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n;
ull Pow[N];
struct segmentTree {
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
struct info1 {
ull hs; int len;
info1 operator + (const info1 &rhs) {
return info1{hs+rhs.hs*Pow[len], len+rhs.len};
}
} a[N<<];
struct info2 {
ull hs; int len;
info2 operator + (const info2 &rhs) {
return info2{rhs.hs+hs*Pow[rhs.len], len+rhs.len};
}
} b[N<<];
void build(int l, int r, int rt) {
if(l == r) {
a[rt] = info1{, };
b[rt] = info2{, };
return;
}
int mid = l + r >> ;
build(lson); build(rson);
a[rt] = a[rt<<] + a[rt<<|];
b[rt] = b[rt<<] + b[rt<<|];
}
void update(int p, int l, int r, int rt) {
if(l == r) {
a[rt] = info1{, };
b[rt] = info2{, };
return ;
}
int mid = l + r >> ;
if(p <= mid) update(p, lson);
else update(p, rson);
a[rt] = a[rt<<] + a[rt<<|];
b[rt] = b[rt<<] + b[rt<<|];
}
info1 querya(int L, int R, int l, int r, int rt) {
if(l >= L && r <= R) return a[rt];
int mid = l + r >> ;
if(R <= mid) return querya(L, R, lson);
else if(L > mid) return querya(L, R, rson);
else return querya(L, R, lson) + querya(L, R, rson);
}
info2 queryb(int L, int R, int l, int r, int rt) {
if(l >= L && r <= R) return b[rt];
int mid = l + r >> ;
if(R <= mid) return queryb(L, R, lson);
else if(L > mid) return queryb(L, R, rson);
else return queryb(L, R, lson) + queryb(L, R, rson);
}
} seg; int main() {
for(int i=Pow[]=; i < N; i++) Pow[i]=Pow[i-]*;
scanf("%d", &n);
seg.build(, n, );
bool flag = false;
for(int i = ; i <= n; i++) {
int x; scanf("%d", &x);
int len = min(x-, n-x);
if(len && seg.querya(x-len, x-, , n, ).hs != seg.queryb(x+, x+len, , n, ).hs)
flag = true;
seg.update(x, , n, );
}
if(flag) puts("YES");
else puts("NO");
return ;
} /*
*/

MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值的更多相关文章

  1. Codeforces Round #321 (Div. 2) E Kefa and Watch (线段树维护Hash)

    E. Kefa and Watch time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  3. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  4. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  5. Educational Codeforces Round 47 (Rated for Div. 2)F. Dominant Indices 线段树合并

    题意:有一棵树,对于每个点求子树中离他深度最多的深度是多少, 题解:线段树合并快如闪电,每个节点开一个权值线段树,递归时合并即可,然后维护区间最多的是哪个权值,到x的深度就是到根的深度减去x到根的深度 ...

  6. 2018.9 ECNU ICPC/CCPC Trial Round #2 Query On Tree (树链剖分+线段树维护)

    传送门:https://acm.ecnu.edu.cn/contest/105/problem/Q/ 一棵树,支持两种操作:给一条路径上的节点加上一个等差数列;求两点路径上节点和. 很明显,熟练剖分. ...

  7. MemSQL Start[c]UP 2.0 - Round 1(无聊练手B题)

    http://codeforces.com/contest/452/problem/B   B. 4-point polyline time limit per test 2 seconds memo ...

  8. MemSQL Start[c]UP 2.0 - Round 2 - Online Round

    搞到凌晨4点一个没出,要gg了. A. Golden System http://codeforces.com/contest/458/problem/A #include<cstdio> ...

  9. MemSQL Start[c]UP 2.0 - Round 1

    A. Eevee http://codeforces.com/contest/452/problem/A 字符串水题 #include<cstdio> #include<cstrin ...

随机推荐

  1. 视音频数据处理入门:PCM音频采样数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  2. echarts地图扩展___自定义的svg图

    echarts的自定义地图 标签引入js文件 <script type="text/javascript" src="echarts/require.js" ...

  3. MacBook Air网络问题

    自从买了本本之后,一直觉得无线网连接不能正常使用,最开始觉得是网络不给力,因为图标都没有满格.后来搬家,网速家里的window,iphone设备都能正常使用,就我的mac 本本图标显示满格,但是网页打 ...

  4. NYOJ 数独 DFS

    数独 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...

  5. [洛谷P2444] [POI2000]病毒

    洛谷题目链接:[POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会 ...

  6. TIP协议

    1. TIP是什么? CISCO给TIP的定义如下: The TIP protocol specifications describe how to multiplex multiple screen ...

  7. 37、使用FileInputStream和FileOutputStream读取和写入

    绝对路径和相对路径 绝对路径:指文件在硬盘上真正存在的路径,比如:D:\Java\HelloWorld.java,这个指的是在电脑的d盘下的Java文件夹里面有个HelloWorld.java文件 相 ...

  8. Python概念-__del__的悲伤

    __del__了不得了,这个是在回收实例化对象时触发执行的方法 每当del 实例化对象时会触发 或者是程序结束时,会触发,总之就是实例化对象失效时都会执行__del__方法 代码示例: class F ...

  9. rollup&&cube

    group by 擴展 rollup&&cube --按job分組計算不同job的匯總工資   SELECT job, SUM (sal)     FROM emp GROUP BY ...

  10. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...