bzoj 2124 神奇的树状数组+hash

xiaoxiao2021-02-28  72

**调了一下午这道题,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; }
转载请注明原文地址: https://www.6miu.com/read-34952.html

最新回复(0)