范浩强treap 普通平衡树
增加Split(分裂),Merge(合并)操作,非常好写,时间也不比普通treap慢什么。
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int l,r;int size,rnd,v; 6 }t[500005*50]; 7 int cnt,rt[500005]; 8 void update(int k) 9 { 10 t[k].size=t[t[k].l].size+t[t[k].r].size+1; 11 } 12 void newnode(int &k,int x) 13 { 14 t[k=++cnt].v=x;t[k].size=1;t[k].rnd=rand(); 15 } 16 int merge(int a,int b) 17 { 18 if(!a||!b)return a+b; 19 if(t[a].rnd>t[b].rnd) 20 { 21 int p=++cnt;t[p]=t[a]; 22 t[p].r=merge(t[p].r,b); 23 update(p); 24 return p; 25 } 26 else 27 { 28 int p=++cnt;t[p]=t[b]; 29 t[p].l=merge(a,t[p].l); 30 update(p); 31 return p; 32 } 33 } 34 void split(int now,int k,int &x,int &y) 35 { 36 if(!now)x=y=0; 37 else 38 { 39 if(t[now].v<=k) 40 { 41 x=++cnt;t[x]=t[now]; 42 split(t[x].r,k,t[x].r,y); 43 update(x); 44 } 45 else 46 { 47 y=++cnt;t[y]=t[now]; 48 split(t[y].l,k,x,t[y].l); 49 update(y); 50 } 51 } 52 } 53 void Delete(int &root,int w) 54 { 55 int x=0,y=0,z=0; 56 split(root,w,x,z); 57 split(x,w-1,x,y); 58 y=merge(t[y].l,t[y].r); 59 root=merge(merge(x,y),z); 60 } 61 void Insert(int &root,int w) 62 { 63 int x=0,y=0,z=0; 64 split(root,w,x,y); 65 newnode(z,w); 66 root=merge(merge(x,z),y); 67 } 68 int getval(int k,int w) 69 { 70 if(w==t[t[k].l].size+1)return t[k].v; 71 else if(w<=t[t[k].l].size)return getval(t[k].l,w); 72 else return getval(t[k].r,w-t[t[k].l].size-1); 73 } 74 int getkth(int &root,int w) 75 { 76 int x,y; 77 split(root,w-1,x,y); 78 int ans=t[x].size+1; 79 root=merge(x,y); 80 return ans; 81 } 82 int getpre(int &root,int w) 83 { 84 int x,y,k,ans; 85 split(root,w-1,x,y); 86 if(!x)return -2147483647; 87 k=t[x].size; 88 ans=getval(x,k); 89 root=merge(x,y); 90 return ans; 91 } 92 int getnex(int &root,int w) 93 { 94 int x,y,ans; 95 split(root,w,x,y); 96 if(!y)return 2147483647; 97 else ans=getval(y,1); 98 root=merge(x,y); 99 return ans; 100 } 101 int main() 102 { 103 int n,f,w,tim; 104 scanf("%d",&n); 105 for(int i=1;i<=n;++i) 106 { 107 scanf("%d%d%d",&tim,&f,&w); 108 rt[i]=rt[tim]; 109 if(f==1)Insert(rt[i],w); 110 else if(f==2)Delete(rt[i],w); 111 else if(f==3)printf("%d\n",getkth(rt[i],w)); 112 else if(f==4)printf("%d\n",getval(rt[i],w)); 113 else if(f==5)printf("%d\n",getpre(rt[i],w)); 114 else printf("%d\n",getnex(rt[i],w)); 115 } 116 return 0; 117 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。