fhq treap本地可过提交RE求助!!!
查看原帖
fhq treap本地可过提交RE求助!!!
156173
dsn20051209楼主2021/9/1 00:33

本地可过提交RE求助``` #include<bits/stdc++.h> #define rint register int using namespace std; const int N=1e6+1e5+5; struct FHQtreap { int son[2],val,rnd,size; }t[N<<2]; int n,m,cnt=0,root=0; int x,y,z,last=0,ans=0; inline int update(int now) { t[now].size=t[t[now].son[0]].size+t[t[now].son[1]].size+1; } inline int insert(int now) { t[++cnt].size=1; t[cnt].val=now; t[cnt].rnd=rand()%0x7fffffff; t[cnt].son[0]=t[cnt].son[1]=0; return cnt; } inline void split(int now,int k,int &x,int &y) { if(!now)x=y=0; else { if(t[now].val<=k) x=now,split(t[now].son[1],k,t[now].son[1],y); else y=now,split(t[now].son[0],k,x,t[now].son[0]); update(now); } } inline int merge(int x,int y) { if(!x||!y)return x+y; if(t[x].rnd<t[y].rnd) { t[x].son[1]=merge(t[x].son[1],y); update(x);return x; } else { t[y].son[0]=merge(x,t[y].son[0]); update(y);return y; } } inline int kth(int now,int k) { for(;;) { if(k<=t[t[now].son[0]].size) now=t[now].son[0]; else if(k==t[t[now].son[0]].size+1)return now; else k-=t[t[now].son[0]].size+1,now=t[now].son[1]; } } int main() { srand((unsigned)time(NULL)); scanf("%d%d",&n,&m); for(rint i=1,a;i<=n;i++) scanf("%d",&a), split(root,a,x,y), root=merge(merge(x,insert(a)),y); for(rint i=1;i<=m;i++) { int opt,a; scanf("%d%d",&opt,&a); a^=last; if(opt==1) split(root,a,x,y), root=merge(merge(x,insert(a)),y); if(opt==2) split(root,a,x,z), split(x,a-1,x,y), y=merge(t[y].son[0],t[y].son[1]), root=merge(merge(x,y),z); if(opt==3) split(root,a-1,x,y), last=t[x].size+1, root=merge(x,y); if(opt==4) last=t[kth(root,a)].val; if(opt==5) split(root,a-1,x,y), last=t[kth(x,t[x].size)].val, root=merge(x,y); if(opt==6) split(root,a,x,y), last=t[kth(y,1)].val, root=merge(x,y); if(opt>=3) ans^=last; } printf("%d",ans); return 0; }

2021/9/1 00:33
加载中...