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. Maven项目导出jar包配置

    <!-- 第一种打包方式 (maven-jar-plugin), 将依赖包和配置文件放到jar包外 --> <build> <sourceDirectory>src ...

  2. Java并发编程原理与实战三十七:线程池的原理与使用

    一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

  3. browser.versions.weixin

    最近做很多HTML5的项目,很多页面会通过微信微博等SNS分享出去.在分享页面上提供公司APP的下载.但是在很多应用的浏览器中,点击下载链接无法下载应用.那么针对这些浏览器我们需要给用户提示从safa ...

  4. Javascript实现返回上一页面并刷新

    今天写了一个小小的提示成功的页面,同时要求返回上一页面,并实现对上一页面的操作进行刷新(例如删除的,添加的),在网上搜寻了一遍,基本上90%的都是说的是用window.history.go(-1), ...

  5. 连接mysql提示Establishing SSL connection without server's identity verification is not recommended错误

    Establishing SSL connection without server's identity verification is not recommended. According to ...

  6. linux源码安装 rpm命令

    安装dhcp为例: 挂载光盘文件到/media目录 #mount /dev/sr0 /media 打开/media目录下的Packages目录 #cd /media/Packages 查看系统是否安装 ...

  7. thinkphp 带条件分页查询

    thinkphp 带条件分页查询:form表单传值时候,method='get'. 用 get 传值

  8. 如何在python的字符串中输入纯粹的{}

    python的format函数通过{}来格式化字符串 >>> a='{0}'.format(123) >>> a ' 如果需要在文本中包含{}字符,这样使用就会报错 ...

  9. Openflow Plugin学习笔记3

    MDController.java 中的start方法,创建了SwitchConnectionHandlerImpl实例 SwitchConnectionHandlerImpl switchConne ...

  10. Web 前端开发规范文档

    通用规范: TAB键用两个空格代替(WINDOWS下TAB键占四个空格,LINUX下TAB键占八个空格). CSS样式属性或者JAVASCRIPT代码后加“;”方便压缩工具“断句”. 文件内容编码均统 ...