关于题意

P4344 [SHOI2015] 脑洞治疗仪

我的fhq_treap的做法,除了第一个点其他的全部WA了,求助 ```cpp #include<cstdio> #include<algorithm> #define N 214514 using namespace std; int seed,md=19260817; void _srand(int x){seed=x;} int _rand(){seed=((seed*7)%md+13)%md;return seed;} int n,m,rt; struct fhq_treap{ int ch[N][2],tag[N],rnd[N],siz[N],tot,sum[N]; int lx0[N],x0[N],rx0[N]; bool val[N]; #define lc ch[x][0] #define rc ch[x][1] int update(int x){ sum[x]=sum[lc]+sum[rc]+val[x]; siz[x]=siz[lc]+siz[rc]+1; x0[x]=max(x0[lc],x0[rc]); lx0[x]=lx0[lc]; rx0[x]=rx0[rc]; if(val[x]==0){ x0[x]=max(x0[x],rx0[lc]+1+lx0[rc]); if(siz[lc]==lx0[lc])lx0[x]=lx0[lc]+1+lx0[rc]; if(siz[rc]==rx0[rc])rx0[x]=rx0[rc]+1+rx0[lc]; } return x; } void assign(int x,int v){ tag[x]=v; if(v==0)x0[x]=lx0[x]=rx0[x]=siz[x]; val[x]=v; } void pushdown(int x){ if(tag[x]!=-1){ if(lc)assign(lc,tag[x]); if(rc)assign(rc,tag[x]); tag[x]=-1; } } void split(int p,int k,int &x,int &y){ if(!p)return void(x=y=0); if(k>siz[ch[p][0]])pushdown(p),split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y); else pushdown(p),split(ch[y=p][0],k,x,ch[p][0]); update(p); } int merge(int x,int y){ if(!x||!y)return x+y; if(rnd[x]<rnd[y]){pushdown(x),pushdown(y),rc=merge(rc,y);return update(x);} else{pushdown(x),pushdown(y),ch[y][0]=merge(x,ch[y][0]);return update(y);} } int newnode(int v){ val[++tot]=v; rnd[tot]=_rand(); sum[tot]=v;siz[tot]=1; if(v==0)x0[tot]=lx0[tot]=rx0[tot]=1; tag[tot]=-1; return tot; } void print(int x){ pushdown(x); if(lc)print(lc); printf("%d ",val[x]); if(rc)print(rc); } }st; signed main(){ _srand(114514); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)rt=st.merge(rt,st.newnode(1)); while(m--){ int op; scanf("%d",&op); if(op==0){ int l,r; scanf("%d%d",&l,&r); int x,y,a,b; st.split(rt,r,x,y); st.split(x,l-1,a,b); st.assign(b,0); rt=st.merge(st.merge(a,b),y); }else if(op==1){ int l0,r0,l1,r1; scanf("%d%d%d%d",&l0,&r0,&l1,&r1); int x,y,a,b,c,d,e,f,g,h; st.split(rt,r0,x,y); st.split(x,l0-1,a,b); int v=st.sum[b]; if(r1<l0){ st.split(a,r1,c,d); st.split(c,l1-1,e,f); int v2=st.sum[f]; int v3=min(v+v2,r1-l1+1); st.split(f,v3,g,h); st.assign(g,1); st.assign(b,0); f=st.merge(g,h); c=st.merge(e,f); a=st.merge(c,d); x=st.merge(a,b); rt=st.merge(x,y); }else{ st.split(y,r1-r0,c,d); st.split(c,l1-r0-1,e,f); int v2=st.sum[f]; int v3=min(v+v2,r1-l1+1); st.split(f,v3,g,h); st.assign(g,1); st.assign(b,0); f=st.merge(g,h); c=st.merge(e,f); y=st.merge(c,d); x=st.merge(a,b); rt=st.merge(x,y); } }else{ int l,r; scanf("%d%d",&l,&r); int x,y,a,b; st.split(rt,r,x,y); st.split(x,l-1,a,b); printf("%d\n",st.x0[b]); rt=st.merge(st.merge(a,b),y); } //st.print(rt); //puts(""); } return 0; } ```
by 黑影洞人 @ 2022-12-20 11:37:55


|