题目链接


题目大意:

就是给你一个全排列,问你是否存在一个c=a+b2c=\frac{a+b}{2}c=2a+b​
满足ccc的位置在a,ba,ba,b之间


解题思路:

  1. 首先我们先按顺序遍历,我们假设遍历到的数是中间那个数就是ccc,那么它要存在的答案的话就是存在一个kkk,使得c−k在之前出现过,c+k还没出现,或者反过来c-k在之前出现过,c+k还没出现,或者反过来c−k在之前出现过,c+k还没出现,或者反过来
  2. 我们设bib_ibi​表示iii这个数是否出现过?
  3. 那么如果ccc这个数没有答案呢?就是对任意的kkk,bc−k=bc+kb_{c-k}=b_{c+k}bc−k​=bc+k​就是要么都同时出现在前面,要么同时出现在后面。
  4. 那么就是对于这个bbb数组,以ccc为中心长度为kkk的回文串!!
  5. 那么我们可以对这个bbb数组进行hashhashhash去判断是否回文,判断两边的hashhashhash是否一样
  6. 要开两个线段树,因为回文两半是对称的,右半边在区间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)相关推荐

  1. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  2. BZOJ1798 【AHOI2009】 seq维护序列 线段树

    维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把 ...

  3. Letters Removing CodeForces - 899F (线段树维护序列)

    大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...

  4. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

  5. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  6. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  7. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  8. 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解

    P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...

  9. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

最新文章

  1. 【jsp】写jsp文件的准备
  2. js传入参数为字符串问题
  3. 印象系列-磁盘和内存的基本认识
  4. WWDC 2013 Session笔记 - iOS7中的多任务
  5. 动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...
  6. html简单跨行跨列表格制作
  7. 定值保险计算举例_机动车辆保险的一些购买原则181536312
  8. 找到驱动精灵屏幕保护图片
  9. 显示器U2518怎么连服务器,工作游戏两不误,戴尔 U2518D显示器太划算-双显示器设置...
  10. php如何打包成apk,windows下PHP批量生成打包android程序APK
  11. 微信小程序常用路由跳转方法
  12. 42表盘直径是从哪测量_表盘直径怎么算,怎样测量手表表盘的直径
  13. 大数据学习教程SD版第三篇【Hadoop HDFS】
  14. 计算机怎么转换英语版本,电脑英文字母大小写怎么转换
  15. 计算机玩游戏特别卡怎么办,电脑玩游戏突然变卡怎么办 玩游戏变卡的解决方法...
  16. cloud-utils
  17. 我的awk常用命令备忘 xargs备忘
  18. c语言原地转10圈,[出圈]-题解(C语言代码)
  19. 商家或企业做小红书种草推广具体有哪些好处?
  20. 微信小程序-自定义导航栏及返回上一级页面的实现

热门文章

  1. 实验四 JSP数据库编程基础
  2. mysql-5.7.24-winx64忘记密码该咋解决
  3. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
  4. Python 的练手项目有哪些值得推荐?
  5. 用于RGB-D语义分割的全局-局部传播网络
  6. AXM-Net:用于行人检测的跨模式上下文注意力网络
  7. 第7章——狄克特斯拉算法
  8. 求n!中含有质因子p的个数
  9. Spring security获取当前用户
  10. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...