线段树 ---- CF452F. Permutation(线段树维护序列Hash)
题目链接
题目大意:
就是给你一个全排列,问你是否存在一个c=a+b2c=\frac{a+b}{2}c=2a+b
满足ccc的位置在a,ba,ba,b之间
解题思路:
- 首先我们先按顺序遍历,我们假设遍历到的数是中间那个数就是ccc,那么它要存在的答案的话就是存在一个kkk,使得c−k在之前出现过,c+k还没出现,或者反过来c-k在之前出现过,c+k还没出现,或者反过来c−k在之前出现过,c+k还没出现,或者反过来
- 我们设bib_ibi表示iii这个数是否出现过?
- 那么如果ccc这个数没有答案呢?就是对任意的kkk,bc−k=bc+kb_{c-k}=b_{c+k}bc−k=bc+k就是要么都同时出现在前面,要么同时出现在后面。
- 那么就是对于这个bbb数组,以ccc为中心长度为kkk的回文串!!
- 那么我们可以对这个bbb数组进行hashhashhash去判断是否回文,判断两边的hashhashhash是否一样
- 要开两个线段树,因为回文两半是对称的,右半边在区间hashhashhash的时候要反过来维护。有点类似左右子树交换。
hash[l,r]=hash[r]−hash[l−1]∗pr−l+1hash[l,r]=hash[r]-hash[l-1]*p^{r-l+1}hash[l,r]=hash[r]−hash[l−1]∗pr−l+1
AC code
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n;
int arr[maxn];
struct node {ull val;int len;
}tleft[maxn << 2],tright[maxn << 2];
ull pw[maxn];
inline node pushup(node l, node r) {node res;res.val = l.val * pw[r.len] + r.val;res.len = l.len + r.len;return res;
}inline void merge(int rt) {tleft[rt] = pushup(tleft[rt<<1],tleft[rt<<1|1]);tright[rt] = pushup(tright[rt<<1|1],tright[rt<<1]);
}void build(int rt, int l, int r) {if(l == r) {tleft[rt].val = 0;tleft[rt].len = 1;tright[rt].val = 0;tright[rt].len = 1;return;}build(Lson);build(Rson);merge(rt);
}void update(int rt, int l, int r, int pos) {if(l == r) {tleft[rt].val = 1;tleft[rt].len = 1;tright[rt].val = 1;tright[rt].len = 1;return;}if(pos <= mid) update(Lson,pos);else update(Rson,pos);merge(rt);
}node query1(int rt, int l, int r, int posl ,int posr) {if(posl <= l && posr >= r) return tleft[rt];if(posr <= mid) return query1(Lson,posl,posr);else if(posl > mid) return query1(Rson,posl,posr);else return pushup(query1(Lson,posl,posr),query1(Rson,posl,posr));
}node query2(int rt, int l, int r, int posl ,int posr) {if(posl <= l && posr >= r) return tright[rt];if(posr <= mid) return query2(Lson,posl,posr);else if(posl > mid) return query2(Rson,posl,posr);else return pushup(query2(Rson,posl,posr),query2(Lson,posl,posr));
}int main() {read(n);build(1,1,n);pw[0] = 1;for(int i = 1; i <= n; ++ i) pw[i] = pw[i-1]*233ull; for(int i = 1; i <= n; ++ i) {int x;read(x);update(1,1,n,x);int k = min(x-1,n-x);if(k < 1) continue;if(query1(1,1,n,x-k,x-1).val!=query2(1,1,n,x+1,x+k).val) {puts("YES");return 0;}}puts("NO");return 0;
}
线段树 ---- CF452F. Permutation(线段树维护序列Hash)相关推荐
- 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题
题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...
- BZOJ1798 【AHOI2009】 seq维护序列 线段树
维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把 ...
- Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2271 Solved: 935 [Submit][St ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1153 Solved: 421 [Submit][Sta ...
最新文章
- 【jsp】写jsp文件的准备
- js传入参数为字符串问题
- 印象系列-磁盘和内存的基本认识
- WWDC 2013 Session笔记 - iOS7中的多任务
- 动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...
- html简单跨行跨列表格制作
- 定值保险计算举例_机动车辆保险的一些购买原则181536312
- 找到驱动精灵屏幕保护图片
- 显示器U2518怎么连服务器,工作游戏两不误,戴尔 U2518D显示器太划算-双显示器设置...
- php如何打包成apk,windows下PHP批量生成打包android程序APK
- 微信小程序常用路由跳转方法
- 42表盘直径是从哪测量_表盘直径怎么算,怎样测量手表表盘的直径
- 大数据学习教程SD版第三篇【Hadoop HDFS】
- 计算机怎么转换英语版本,电脑英文字母大小写怎么转换
- 计算机玩游戏特别卡怎么办,电脑玩游戏突然变卡怎么办 玩游戏变卡的解决方法...
- cloud-utils
- 我的awk常用命令备忘 xargs备忘
- c语言原地转10圈,[出圈]-题解(C语言代码)
- 商家或企业做小红书种草推广具体有哪些好处?
- 微信小程序-自定义导航栏及返回上一级页面的实现
热门文章
- 实验四 JSP数据库编程基础
- mysql-5.7.24-winx64忘记密码该咋解决
- 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
- Python 的练手项目有哪些值得推荐?
- 用于RGB-D语义分割的全局-局部传播网络
- AXM-Net:用于行人检测的跨模式上下文注意力网络
- 第7章——狄克特斯拉算法
- 求n!中含有质因子p的个数
- Spring security获取当前用户
- 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...