【fhq treap】【平衡樹】
阿新 • • 發佈:2022-04-09
fhq不僅比splay跑得快,還比splay好寫得多。
Code模板
#include<bits/stdc++.h> using namespace std; //#define int long long inline int read() { int x=0,w=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if(ch=='-') {w=-1;ch=getchar();} while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*w; } inline void write(int x) { if(x<0) putchar('-'),x=~(x-1); if(x>9) write(x/10); putchar('0'+x%10); } const int N=1e5+100; int n,tot,rt; struct fhq{ int siz,ls,rs,val,rd; }t[N]; int newnode(int val) { tot++;t[tot].siz=1;t[tot].ls=t[tot].rs=0; t[tot].val=val;t[tot].rd=rand(); return tot; } void pushup(int x) { t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1; } void split(int now,int val,int &x,int &y) { if(now==0) {x=y=0;return; } if(t[now].val<=val) x=now,split(t[now].rs,val,t[now].rs,y); else y=now,split(t[now].ls,val,x,t[now].ls); pushup(now); } int merge(int x,int y) { if(!x||!y) return x+y; if(t[x].rd<t[y].rd) {t[x].rs=merge(t[x].rs,y);pushup(x);return x; } else {t[y].ls=merge(x,t[y].ls); pushup(y);return y; } } void insert(int val) { int x,y; split(rt,val,x,y); rt=merge(x,merge(newnode(val),y)); } void del(int val) { int x,y,z; split(rt,val,x,z);split(x,val-1,x,y); rt=merge(x,merge(merge(t[y].ls,t[y].rs),z)); } int findval(int k) { int now=rt; while(now) { if(k==t[t[now].ls].siz+1) return t[now].val; if(k<=t[t[now].ls].siz) now=t[now].ls; else k-=t[t[now].ls].siz+1,now=t[now].rs; } } signed main() { n=read(); for(int i=1;i<=n;++i) { int op=read(),x=read(),y,z; if(op==1) insert(x); else if(op==2) del(x); else if(op==3) split(rt,x-1,y,z),write(t[y].siz+1),puts(""),rt=merge(y,z); else if(op==4) write(findval(x)),puts(""); else if(op==5) split(rt,x-1,y,z),rt=y,write(findval(t[y].siz)),puts(""),rt=merge(y,z); else if(op==6) split(rt,x,y,z),rt=z,write(findval(1)),puts(""),rt=merge(y,z); } return 0; }