Description
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
Input
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)
Output
对于操作3,4,5,6每行输出一个数,表示对应答案
Sample Input
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
106465
84185
492737
84185
492737
测试各类平衡树模板
首先是treap
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int n,o,p,ch,b,f; inline int read(){ p=0;ch=getchar();f=1; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar(); return p*f; } struct tree{ int l,r,k,ra,w,s; tree(){ l=r=0; } }; struct treap{ int size,root; tree t[100001]; treap(){ size=0;root=0; } inline void ler(int &p){ int k=t[p].r; t[p].r=t[k].l; t[k].l=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void rir(int &p){ int k=t[p].l; t[p].l=t[k].r; t[k].r=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void insert(int &p,int k){ if (p==0){ p=++size; t[p].k=k; t[p].w=1; t[p].s=1; t[p].ra=rand(); return; } t[p].s++; if (t[p].k==k) t[p].w++;else if (t[p].k>k){ insert(t[p].l,k); if (t[t[p].l].ra<t[p].ra) rir(p); }else{ insert(t[p].r,k); if (t[t[p].r].ra<t[p].ra) ler(p); } } inline void dell(int &p){ if (t[p].l==0&&t[p].r==0) p=0;else if (t[p].l==0) ler(p),dell(t[p].l);else if (t[p].r==0) rir(p),dell(t[p].r);else if (t[t[p].l].ra<t[t[p].r].ra) rir(p),dell(t[p].r);else ler(p),dell(t[p].l); } inline void del(int &p,int k){ t[p].s--; if (t[p].k==k){ t[p].w--; if (t[p].w) return; dell(p); }else if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k); } inline int qua(int p,int k){ if (p==0) return p=-1e9; if (t[p].k<=k) return qua(t[p].r,k);else{ int u=qua(t[p].l,k); if (u==-1e9) return t[p].k;else return u; } } inline int qui(int p,int k){ if (p==0) return -1e9; if (t[p].k>=k) return qui(t[p].l,k);else{ int u=qui(t[p].r,k); if (u==-1e9) return t[p].k;else return u; } } inline int qup(int p,int k){ if (!p) return 0; if (t[p].k>=k) return qup(t[p].l,k);else return qup(t[p].r,k)+t[t[p].l].s+t[p].w; } inline int qu(int p,int k){ if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k) return t[p].k;else if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s); } }; treap t; int main(){ n=read(); srand(n); while(n--){ o=read();b=read(); if (o==1) t.insert(t.root,b);else if (o==2) t.del(t.root,b);else if (o==3) printf("%d ",t.qup(t.root,b)+1);else if (o==4) printf("%d ",t.qu(t.root,b));else if (o==5) printf("%d ",t.qui(t.root,b));else printf("%d ",t.qua(t.root,b)); } }
然后是SBT
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int n,o,p,ch,b,f; inline int read(){ p=0;ch=getchar();f=1; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar(); return p*f; } struct tree{ int l,r,k,w,s; tree(){ l=r=0; } }; struct SBT{ int size,root; tree t[100001]; SBT(){ size=0;root=0; } inline void ler(int &p){ int k=t[p].r; t[p].r=t[k].l; t[k].l=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void rir(int &p){ int k=t[p].l; t[p].l=t[k].r; t[k].r=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void ph(int &p,bool bo){ if (!bo){ if (t[t[p].r].s<t[t[t[p].l].l].s) rir(p);else if (t[t[p].r].s<t[t[t[p].l].r].s){ ler(t[p].l); rir(p); }else return; }else{ if (t[t[p].l].s<t[t[t[p].r].r].s) ler(p);else if (t[t[p].l].s<t[t[t[p].r].l].s){ rir(t[p].r); ler(p); }else return; } ph(t[p].l,0); ph(t[p].r,1); ph(p,0); ph(p,1); } inline void insert(int &p,int k){ if (p==0){ p=++size; t[p].k=k; t[p].w=1; t[p].s=1; return; } t[p].s++; if (t[p].k==k) t[p].w++;else if (t[p].k>k){ insert(t[p].l,k); }else{ insert(t[p].r,k); } ph(p,t[p].k<=k); } inline void dell(int &p){ if (t[p].l==0&&t[p].r==0) p=0;else if (t[p].l==0) ler(p),dell(t[p].l);else if (t[p].r==0) rir(p),dell(t[p].r);else rir(p),dell(t[p].r); } inline void del(int &p,int k){ t[p].s--; if (t[p].k==k){ t[p].w--; if (t[p].w) return; dell(p); }else if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k); ph(p,0); ph(p,1); } inline int qua(int p,int k){ if (p==0) return p=-1e9; if (t[p].k<=k) return qua(t[p].r,k);else{ int u=qua(t[p].l,k); if (u==-1e9) return t[p].k;else return u; } } inline int qui(int p,int k){ if (p==0) return -1e9; if (t[p].k>=k) return qui(t[p].l,k);else{ int u=qui(t[p].r,k); if (u==-1e9) return t[p].k;else return u; } } inline int qup(int p,int k){ if (!p) return 0; if (t[p].k>=k) return qup(t[p].l,k);else return qup(t[p].r,k)+t[t[p].l].s+t[p].w; } inline int qu(int p,int k){ if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k) return t[p].k;else if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s); } }; SBT t; int main(){ n=read(); while(n--){ o=read();b=read(); if (o==1) t.insert(t.root,b);else if (o==2) t.del(t.root,b);else if (o==3) printf("%d ",t.qup(t.root,b)+1);else if (o==4) printf("%d ",t.qu(t.root,b));else if (o==5) printf("%d ",t.qui(t.root,b));else printf("%d ",t.qua(t.root,b)); } }
最后是SPLAY
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int n,o,p,ch,b,f; inline int read(){ p=0;ch=getchar();f=1; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar(); return p*f; } struct tree{ int l,r,k,w,f,s; tree(){ f=l=r=0; } }; struct splay_tree{ int size,root; tree t[100001]; splay_tree(){ size=0;root=0; } inline void ler(int &p){ int k=t[p].r; t[k].f=t[p].f; t[p].f=k; t[t[k].l].f=p; t[p].r=t[k].l; t[k].l=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void rir(int &p){ int k=t[p].l; t[k].f=t[p].f; t[p].f=k; t[t[k].r].f=p; t[p].l=t[k].r; t[k].r=p; t[k].s=t[p].s; t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w; p=k; } inline void ph(int &x,bool bo){ if (bo) rir(x);else ler(x); } inline bool getc(int x){ return t[t[x].f].l==x; } inline void rot(int l){ if (getc(t[l].f)) ph(t[t[t[l].f].f].l,getc(l));else ph(t[t[t[l].f].f].r,getc(l)); } inline void splay(int l){ while (l!=root&&l){ if (t[l].f==root) ph(root,getc(l));else{ int p=t[t[l].f].f; if (getc(l)==getc(t[l].f)){ if (p==root) ph(root,getc(t[l].f)),ph(root,getc(l));else rot(t[l].f),rot(l); }else{ if (p==root) rot(l),ph(root,getc(l));else rot(l),rot(l); } } } } inline void insert(int &p,int k,int f){ if (p==0){ p=++size; t[p].k=k; t[p].w=1; t[p].f=f; t[p].s=1; splay(p); return; } t[p].s++; if (t[p].k==k) t[p].w++;else if (t[p].k>k) insert(t[p].l,k,p);else insert(t[p].r,k,p); } inline void dell(int &p){ if (t[p].l==0&&t[p].r==0) p=0;else if (t[p].l==0) ler(p),dell(t[p].l);else rir(p),dell(t[p].r); } inline void del(int &p,int k){ t[p].s--; if (t[p].k==k){ t[p].w--; if (t[p].w){splay(p);return;} dell(p); }else if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k); } inline int qua(int p,int k){ if (p==0) return p=-1e9; if (t[p].k<=k) return qua(t[p].r,k);else{ int u=qua(t[p].l,k); if (u==-1e9) return t[p].k;else return u; } } inline int qui(int p,int k){ if (p==0) return -1e9; if (t[p].k>=k) return qui(t[p].l,k);else{ int u=qui(t[p].r,k); if (u==-1e9){splay(p);return t[p].k;}else return u; } } inline int qup(int p,int k){ if (p==0) return 0; if (t[p].k>=k) return qup(t[p].l,k);else return qup(t[p].r,k)+t[t[p].l].s+t[p].w; } inline int qu(int p,int k){ if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k){splay(p);return t[p].k;}else if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s); } }; splay_tree t; int main(){ n=read(); while(n--){ o=read();b=read(); if (o==1) t.insert(t.root,b,0);else if (o==2) t.del(t.root,b);else if (o==3) printf("%d ",t.qup(t.root,b)+1);else if (o==4) printf("%d ",t.qu(t.root,b));else if (o==5) printf("%d ",t.qui(t.root,b));else printf("%d ",t.qua(t.root,b)); } }