BZOJ 2124: 等差子序列 [树状数组][hash]
来源:互联网 发布:牛肉汤成本算法 编辑:程序博客网 时间:2024/06/06 10:07
题面传送门
题解
只要找有没有长度为3的等差子序列
是一个排列,用一个辅助数组
按顺序修改
可以用树状数组或线段树维护
#include<cstdio>#include<algorithm>#include<cstring>#define N 10005#define ULL unsigned long longusing 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的问题终于决定找份代码对拍,肉眼看了一下发现我居然有一句调试语句没有删,而且不是我自己加的调试语句…
阅读全文