题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2124

题意:给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。

题解:显然若存在i < j < k,使得 aj - ai = ak - aj 则答案存在,考虑枚举 j ,判断是否存在 t 使得 aj - t 在 j 的左边且 aj + t 在 j 的右边。 对 n 个点建线段树,如果数 v 在 aj 的左边则线段树第 v 个叶子节点值为 1,否则为 0,枚举 j 的过程中进行单点修改,可以发现枚举到 j 的时候,若不存在长度为 3 的等差数列,则左边倒着和右边正着的 01 序列是完全相同的,故可以用哈希来维护一个区间正着和倒着的值,查询直接判断是否相等即可。(注意细节)

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e4 + ;
const int MAXM = 1e3 + ;
const ll mod = 1e9 + ; int a[MAXN];
ll add[MAXN],hash1[MAXN<<],hash2[MAXN<<]; void pushup(int rt,int l,int r) {
int mid = (l + r) >> ;
hash1[rt] = (hash1[rt<<] * add[r - mid] + hash1[rt<<|]) % mod;
hash2[rt] = (hash2[rt<<|] * add[mid - l + ] + hash2[rt<<]) % mod;
} void update(int rt,int l,int r,int pos) {
if(l == r) {
hash1[rt] = hash2[rt] = ;
return ;
}
int mid = (l + r) >> ;
if(pos <= mid) update(rt<<,l,mid,pos);
else update(rt<<|,mid + ,r,pos);
pushup(rt,l,r);
} ll query1(int rt,int l,int r,int ql,int qr) {
if(ql > qr) return ;
if(ql == l && qr == r) return hash1[rt];
int mid = (l + r) >> ;
if(qr <= mid) return query1(rt<<,l,mid,ql,qr);
else if(ql > mid) return query1(rt<<|,mid + ,r,ql,qr);
else return (query1(rt<<,l,mid,ql,mid) * add[qr - mid] + query1(rt<<|,mid + ,r,mid + ,qr)) % mod;
} ll query2(int rt,int l,int r,int ql,int qr) {
if(ql > qr) return ;
if(ql == l && qr == r) return hash2[rt];
int mid = (l + r) >> ;
if(qr <= mid) return query2(rt<<,l,mid,ql,qr);
else if(ql > mid) return query2(rt<<|,mid + ,r,ql,qr);
else return (query2(rt<<|,mid + ,r,mid + ,qr) * add[mid - ql + ] + query2(rt<<,l,mid,ql,mid)) % mod;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
add[] = ;
for(int i = ; i < MAXN; i++) add[i] = add[i - ] * (ll) % mod;
int t;
scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
for(int i = ; i <= n; i++) scanf("%d",&a[i]);
mst(hash1, );
mst(hash2, );
bool flag = false;
for(int i = ; i <= n; i++) {
int len = min(a[i] - , n - a[i]);
ll ans1 = query1(,,n,a[i] - len,a[i] - );
ll ans2 = query2(,,n,a[i] + ,a[i] + len);
if(ans1 != ans2) {
flag = true;
break;
}
update(,,n,a[i]);
}
if(flag) puts("Y");
else puts("N");
}
return ;
}

BZOJ 2124 (线段树 + hash)的更多相关文章

  1. BZOJ 2124 线段树维护hash值

    思路: http://blog.csdn.net/wzq_QwQ/article/details/47152909 (代码也是抄的他的) 自己写得垃圾线段树怎么都过不了 隔了两个月 再写 再挂 又隔了 ...

  2. bzoj2124: 等差子序列线段树+hash

    bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...

  3. Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash

    E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...

  4. BZOJ_2124_等差子序列_线段树+Hash

    BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...

  5. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  6. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

    bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即 ...

  7. BZOJ2124:等差子序列(线段树,hash)

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...

  8. hdu 5172(线段树||HASH)

    GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. CF452F等差子序列 & 线段树+hash查询区间是否为回文串

    记录一下一个新学的线段树基础trick(真就小学生trick呗) 给你一个1到n的排列,你需要判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列.\(n\) <= ...

随机推荐

  1. jquery 实时监听输入框值变化的完美方案

    只需要同时绑定 oninput 和 onpropertychange 两个事件,但是这并不完美 $('.input-form :input').bind('input propertychange', ...

  2. ######【Python】【基础知识】【一些未知的知识点】######

    在查资料.看书过程中遇到的一些未知的领域.知识点: 1.模仿静态变量 可参考: https://www.runoob.com/python/python-exercise-example41.html ...

  3. Spring实例化Bean三种方法:构造器、静态工厂、实例工厂

    Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...

  4. java获取单张网页中img标签中的src

    /** * 得到网页中图片的地址 */ public static List<String> getImgStr(String htmlStr) { List<String> ...

  5. css选择器找亲戚

    1.first-child first-child表示选择列表中的第一个标签.代码如下: li:first-child{background:#090} 上面的意思是,li 列表中的 第一个li模块的 ...

  6. 三 HashSet

    HashSet无序且不能重复 1.HashSet类的字段属性 //HashSet集合中的内容是通过 HashMap 数据结构来存储的 private transient HashMap<E,Ob ...

  7. 安卓SharedPreferences类的使用

    package com.lidaochen.phonecall; import android.content.Intent; import android.content.SharedPrefere ...

  8. WinPE基础知识之头部

    1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...

  9. Oracle---PL/SQL的学习

    PL/SQL程序 一.定义 declare 说明部分 begin 语句序列(DML语句) exception 例外处理语句 end; 二. 变量和常量说明 a) 说明变量(char,varchar2, ...

  10. 6.SpringMVC 配置式开发-处理器

    处理器除了实现Controller 接口外,还可以继承自一些其他的类,来完成一些特殊的功能 1.继承自AbstractController类 若处理器继承自AbstractController类,那么 ...