**调了一下午这道题,bzoj还必须要人把读入读完。
这道题关键是用树状数组来实现求类似等比数列的东东。
还有就是要想到转换成字符串比较是否是回文。
详细就懒得说了0 0,直接上代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define N 10010
using namespace std;
int t,n,x,power[N];
int const mod=1000000007;
struct abcd{
int c[N];
void clear(){memset(c,0,sizeof(c));}
void add(int pos){
for(int i=pos;i<=n;i+=(i&-i))//这个树状数组实际上是序号越大越小
c[i]=(c[i] + power[i-pos])%mod;
}
int q(int pos){
int rt=0;
for(int i=pos;i;i-=(i&-i))
rt=((long long)c[i]*power[pos-i] + rt)%mod;
return rt;
}
int query(int l,int r){
int xx=q(r),yy=q(l-1);
return ( xx-(long long)yy*power[r-l+1]%mod+mod )%mod;
}
};
abcd a1,a2;
int main(){
scanf("%d",&t);
power[0]=1;
for(int i=1;i<N;i++)power[i]=(power[i-1]*2)%mod;
while(t--){
a1.clear();a2.clear();
scanf("%d",&n);
int i,flag=0;
for(i=1;i<=n;i++){
scanf("%d",&x);
int len=min(x-1,n-x);
if(len&&a1.query(x-len,x-1)!=a2.query(n-x-len+1,n-x))flag=1;
a1.add(x);
a2.add(n-x+1);
}
if(flag==1)printf("Y\n");
else printf("N\n");
}
return 0;
}