题解
只要找有没有长度为3的等差子序列
是一个排列,用一个辅助数组 b[i]=0/1 记录 i 有没有出现过
按顺序修改
可以用树状数组或线段树维护
b
的hash值,正着一个反着一个,判断在
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 10005
#define ULL unsigned long long
using namespace std;
int n;
ULL pw[N],t[2][N];
inline int read(){
int a=0;char f=1,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}
return a*f;
}
inline void add(int opt,int x){
for(int i=x;i<=n;i+=i&-i)
t[opt][i]+=pw[i-x];
}
inline ULL ask(int opt,int x){
ULL res=0;
for(int i=x;i;i-=i&-i)
res+=t[opt][i]*pw[x-i];
return res;
}
inline ULL query(int opt,int l,int r){
ULL ql=ask(opt,l-1),qr=ask(opt,r);
return qr-ql*pw[r-l+1];
}
int main(){
pw[0]=1;for(int i=1;i<=10000;++i) pw[i]=pw[i-1]*233;
int T=read();
while(T--){
n=read();
memset(t,0,sizeof(t));
bool flag=0;
for(int i=1;i<=n;++i){
int x=read();
if(flag) continue;
int len=min(x-1,n-x);
if(len&&query(0,x-len,x-1)!=query(1,n-(x+len-1),n-x)) flag=1;
add(0,x),add(1,n-x+1);
}
if(!flag) puts("N");
else puts("Y");
}
return 0;
}
wa了无数发我以为是hash的问题终于决定找份代码对拍,肉眼看了一下发现我居然有一句调试语句没有删,而且不是我自己加的调试语句…