【BZOJ】2124 等差子序列 线段树+hash
2018-01-12 21:15
260 查看
题目传送门
等等……这题好像在哪里做过……
哦,Codeforces 452F,原题哈……
为什么我还是不会做啊……
就当是复习一遍吧,这种想法还是挺好的。
p.s.WA了两发,错在了updata上……好像updata这个地方好容易出错啊。
附上AC代码:
等等……这题好像在哪里做过……
哦,Codeforces 452F,原题哈……
为什么我还是不会做啊……
就当是复习一遍吧,这种想法还是挺好的。
p.s.WA了两发,错在了updata上……好像updata这个地方好容易出错啊。
附上AC代码:
#include <cstdio> #include <cctype> #include <algorithm> using namespace std; typedef unsigned int uint; const int N=1e4+10; int ti,n,a ,len[N<<2],c,lst,ans; uint sd ,lh[N<<2],rh[N<<2],h1,h2,hash; inline char nc(void){ static char ch[100010],*p1=ch,*p2=ch; return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++; } inline void read(int &a){ static char c=nc();int f=1; for (;!isdigit(c);c=nc()) if (c=='-') f=-1; for (a=0;isdigit(c);a=(a<<3)+(a<<1)+c-'0',c=nc()); return (void)(a*=f); } #define lt (k<<1) #define rt (k<<1|1) #define mid (l+r>>1) inline void build(int k,int l,int r){ lh[k]=rh[k]=0; if (l==r) return (void)(len[k]=1); build(lt,l,mid),build(rt,mid+1,r); return (void)(len[k]=len[lt]+len[rt]); } inline void updata(int k){ lh[k]=lh[lt]+lh[rt]*sd[len[lt]]; rh[k]=rh[rt]+rh[lt]*sd[len[rt]]; return; } inline void change(int k,int l,int r,int w){ if (l==r) return (void)(lh[k]=rh[k]=1); if (w<=mid) change(lt,l,mid,w); else change(rt,mid+1,r,w); return updata(k); } inline void queryl(int k,int l,int r,int ql,int qr){ if (l>=ql&&r<=qr) return (void)(hash+=lh[k]*sd[lst],lst+=len[k]); if (ql<=mid) queryl(lt,l,mid,ql,qr); if (qr>mid) queryl(rt,mid+1,r,ql,qr); return; } inline void queryr(int k,int l,int r,int ql,int qr){ if (l>=ql&&r<=qr) return (void)(hash+=rh[k]*sd[lst],lst+=len[k]); if (qr>mid) queryr(rt,mid+1,r,ql,qr); if (ql<=mid) queryr(lt,l,mid,ql,qr); return; } int main(void){ sd[0]=1; for (int i=1; i<=10000; ++i) sd[i]=sd[i-1]*233; for (read(ti); ti; --ti){ read(n); for (int i=1; i<=n; ++i) read(a[i]); build(1,1,n),ans=1; for (int i=1; i<=n; ++i){ change(1,1,n,a[i]),c=min(a[i]-1,n-a[i]); if (c){ h1=h2=0; hash=lst=0,queryl(1,1,n,a[i]+1,a[i]+c),h1=hash; hash=lst=0,queryr(1,1,n,a[i]-c,a[i]-1),h2=hash; if (!(ans&=(h1==h2))) break; } } puts(ans?"N":"Y"); } return 0; }
相关文章推荐
- BZOJ_2124_等差子序列_线段树+Hash
- BZOJ2124 等差子序列-线段树+hash
- 【bzoj2124】等差子序列 STL-bitset
- bzoj2124 等差子序列(hash+线段树)
- 2124: 等差子序列 - BZOJ
- bzoj2124 等差子序列
- [BZOJ 2124] 等差子序列 Hash+树状数组(附粗略证明)
- BZOJ 2124等差子序列 线段树&&hash
- BZOJ 2124: 等差子序列
- bzoj 2124: 等差子序列 (线段树+hash)
- bzoj2124 等差子序列【暴力】
- BZOJ 2124: 等差子序列 [树状数组][hash]
- bzoj 2124: 等差子序列 树状数组&hash
- BZOJ2124 等差子序列(树状数组+哈希)
- 【bzoj2124】等差子序列 权值线段树维护hash
- bzoj 2124: 等差子序列
- BZOJ 2124: 等差子序列
- [bzoj2124]等差子序列_线段树_hash
- Bzoj2124 等差子序列
- bzoj2124 等差子序列 (树状数组 维护hash值)