您的位置:首页 > 其它

【BZOJ】2124 等差子序列 线段树+hash

2018-01-12 21:15 260 查看
题目传送门

等等……这题好像在哪里做过……

哦,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: