BZOJ 2124: 等差子序列
2017-01-09 16:35
351 查看
2124: 等差子序列
Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1041 Solved: 376
[Submit][Status][Discuss]
Description
给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。Input
输入的第一行包含一个整数T,表示组数。下接T组数据,每组第一行一个整数N,每组第二行为一个1到N的排列,数字两两之间用空格隔开。Output
对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一行“N”。Sample Input
23
1 3 2
3
3 2 1
Sample Output
NY
HINT
对于100%的数据,N<=10000,T<=7Source
分析:
我们只需要判断是否存在一个长度为3的等差子序列就好...首先我们有一个很机智的想法...我们枚举中间的数x,判断是否存在x-y和x+y分别在x两边...我们从左向右扫描当前数字记为中间数字,维护一个vis数组,vis[i]=1代表i在当前数字之前出现过,=0代表没有出现过...然后只要当前数字的左右两边的01串不一样就代表存在一组合法解...
这种判断回文串的问题可以通过hash解决,但是我们要动态维护hash值,所以要借助树状数组或者线段树...
记得一定要开long long...
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn #define int long long using namespace std; //眉眼如初,岁月如故 const int maxn=10000+5,Mod=1e9+7; int n,cas,flag,p[maxn]; struct Tree{ long long tr[maxn]; inline void clear(void){ memset(tr,0,sizeof(tr)); } inline void insert(int x,int y){ int lala=x; for(;x<=n;x+=x&-x) (tr[x]+=y*p[x-lala])%=Mod; } inline int query(int x){ int lala=x,res=0; for(;x;x-=x&-x) (res+=((long long)tr[x]*p[lala-x])%Mod)%Mod; return res; } inline int qry(int l,int r){ return ((long long)query(r)-(long long)query(l-1)*p[r-l+1]%Mod+Mod)%Mod; } }a,b; signed main(void){ scanf("%lld",&cas);p[0]=1; for(int i=1;i<=10000;i++) p[i]=(p[i-1]<<1)%Mod; while(cas--){ scanf("%lld",&n);flag=0; a.clear();b.clear(); for(int i=1,x;i<=n;i++){ scanf("%lld",&x); if(flag) continue; int lala=min(x-1,n-x); if(lala&&a.qry(x-lala,x-1)!=b.qry(n-(x+lala)+1,n-(x+1)+1)) puts("Y"),flag=1; a.insert(x,1),b.insert(n-x+1,1); } if(!flag) puts("N"); } return 0; }
By NeighThorn
相关文章推荐
- bzoj2124 等差子序列(hash+线段树)
- Bzoj2124 等差子序列
- bzoj 2124: 等差子序列
- bzoj2124 等差子序列
- BZOJ 2124: 等差子序列
- BZOJ 2124等差子序列 线段树&&hash
- BZOJ 2124 等差子序列 (树状数组 hash)
- 【BZOJ2124】等差子序列 树状数组维护hash值
- BZOJ 2124: 等差子序列 [树状数组][hash]
- bzoj2124 等差子序列【暴力】
- 2124: 等差子序列 - BZOJ
- 【bzoj2124】等差子序列 STL-bitset
- [bzoj2124]等差子序列_线段树_hash
- bzoj 2124: 等差子序列 树状数组&hash
- [bzoj2124]等差子序列——线段树+字符串哈希
- BZOJ2124 等差子序列-线段树+hash
- 【bzoj2124】等差子序列 权值线段树维护hash
- bzoj2124 等差子序列 (树状数组 维护hash值)
- BZOJ2124 等差子序列(树状数组+哈希)
- BZOJ 2124 等差子序列 线段树维护hash值