【fhq-treap】P3369 【模板】普通平衡树 & P3391 【模板】文艺平衡树
fhq-treap基本操作
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int t; struct fhq_treap { int l,r,v,rnd,siz; }fhq[maxn]; int tot,root; int newnode(int val) { ++tot; fhq[tot].v=val; fhq[tot].rnd=rand(); fhq[tot].siz=1; return tot; } void update(int x) { fhq[x].siz=fhq[fhq[x].l].siz+fhq[fhq[x].r].siz+1; } void split(int now,int k,int &x,int &y) { if(!now) x=0,y=0; else { if(fhq[now].v<=k) { x=now; split(fhq[now].r,k,fhq[now].r,y); } else { y=now; split(fhq[now].l,k,x,fhq[now].l); } update(now); } } int merge(int x,int y) { if(!x || !y) return x+y; if(fhq[x].rnd<=fhq[y].rnd) { fhq[x].r=merge(fhq[x].r,y); update(x); return x; } else { fhq[y].l=merge(x,fhq[y].l); update(y); return y; } } void add(int val) { int x,y; split(root,val,x,y); root=merge(merge(x,newnode(val)),y); } void del(int val) { int x,y,z; split(root,val,x,z); split(x,val-1,x,y); y=merge(fhq[y].l,fhq[y].r); root=merge(merge(x,y),z); } void getrank(int val) { int x,y; split(root,val-1,x,y); printf("%d\n",fhq[x].siz+1); root=merge(x,y); } void get(int val) { int now=root; while(now) { if(fhq[fhq[now].l].siz+1==val) break; else if(fhq[fhq[now].l].siz+1>val) now=fhq[now].l; else { val-=fhq[fhq[now].l].siz+1; now=fhq[now].r; } } printf("%d\n",fhq[now].v); } void pre(int val) { int x,y; split(root,val-1,x,y); int now=x; while(fhq[now].r) now=fhq[now].r; printf("%d\n",fhq[now].v); root=merge(x,y); } void nxt(int val) { int x,y; split(root,val,x,y); int now=y; while(fhq[now].l) now=fhq[now].l; printf("%d\n",fhq[now].v); root=merge(x,y); } int main() { // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); scanf("%d",&t); while(t--) { int op,x; scanf("%d%d",&op,&x); if(op==1) add(x); if(op==2) del(x); if(op==3) getrank(x); if(op==4) get(x); if(op==5) pre(x); if(op==6) nxt(x); } return 0; }
文艺平衡树
代码
#include<bits/stdc++.h> using namespace std; int n,m; const int maxn=1e5+5; struct fhq_treap { int l,r,v,siz,rnd,lz; }fhq[maxn]; int root,tot; int newnode(int val) { ++tot; fhq[tot].siz=1; fhq[tot].v=val; fhq[tot].rnd=rand(); return tot; } void update(int now) { fhq[now].siz=fhq[fhq[now].l].siz+fhq[fhq[now].r].siz+1; } void pushdown(int now) { if(!fhq[now].lz) return; swap(fhq[now].l,fhq[now].r); fhq[fhq[now].l].lz^=1; fhq[fhq[now].r].lz^=1; fhq[now].lz=0; return; } void split(int now,int k,int &x,int &y) { if(!now) x=y=0; else { pushdown(now); if(fhq[fhq[now].l].siz<k) { x=now; split(fhq[now].r,k-fhq[fhq[now].l].siz-1,fhq[now].r,y); } else { y=now; split(fhq[now].l,k,x,fhq[now].l); } update(now); } } int merge(int x,int y) { if(!x || !y) return x+y; if(fhq[x].rnd<=fhq[y].rnd) { pushdown(x); fhq[x].r=merge(fhq[x].r,y); update(x); return x; } else { pushdown(y); fhq[y].l=merge(x,fhq[y].l); update(y); return y; } } void reverse(int l,int r) { int x,y,z; split(root,l-1,x,y); split(y,r-l+1,y,z); fhq[y].lz^=1; root=merge(merge(x,y),z); } void ldr(int now) { if(!now) return; pushdown(now); ldr(fhq[now].l); printf("%d ",fhq[now].v); ldr(fhq[now].r); } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) root=merge(root,newnode(i)); for(int i=1;i<=m;i++) { int l,r; scanf("%d%d",&l,&r); reverse(l,r); } ldr(root); return 0; }