先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸。
昨天treap就搞了一下午,感觉自己弱爆了。然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz。
所以写个博客防止自己忘了吧(其实就是贴个代码)。
其实fhq treap中最重要的操作就是split和merge,这样就避免了普通treap中的zig和zag,而且各种查询十分方便,基本查个排名就出来了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<vector> 7 using namespace std; 8 const int N=1e5+10; 9 int root,tot; 10 struct Treap{ 11 int l,r,dat,val,size; 12 }tr[N]; 13 void update(int p){tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;} 14 int New(int val){ 15 int x=++tot; 16 tr[x].val=val; 17 tr[x].dat=rand(); 18 tr[x].size=1; 19 return x; 20 } 21 void merge(int &root,int a,int b){ 22 if(!a||!b){ 23 root=a+b; 24 return ; 25 } 26 if(tr[a].dat<tr[b].dat){//a shi baba 27 root=a; 28 merge(tr[root].r,tr[a].r,b); 29 } 30 else{ 31 root=b; 32 merge(tr[root].l,a,tr[b].l); 33 } 34 update(root); 35 } 36 void split(int x,int &a,int &b,int val){ 37 if(!x){ 38 a=b=0; 39 return ; 40 } 41 if(tr[x].val<=val){ 42 a=x; 43 split(tr[x].r,tr[a].r,b,val); 44 } 45 else{ 46 b=x; 47 split(tr[x].l,a,tr[b].l,val); 48 } 49 update(x); 50 } 51 int getrankbyval(int &root,int val){ 52 int x=0,y=0; 53 split(root,x,y,val-1); 54 int ans=tr[x].size+1; 55 merge(root,x,y); 56 return ans; 57 } 58 int getvalbyrank(int &root,int rank){ 59 int x=root; 60 while(tr[tr[x].l].size+1!=rank){ 61 if(rank<=tr[tr[x].l].size) x=tr[x].l; 62 else rank-=(tr[tr[x].l].size+1),x=tr[x].r; 63 } 64 return tr[x].val; 65 } 66 void insert(int &root,int val){ 67 int x=0,y=0; 68 split(root,x,y,val); 69 merge(x,x,New(val)); 70 merge(root,x,y); 71 } 72 void remove(int &root,int val){ 73 int x=0,y=0,z=0; 74 split(root,x,y,val); 75 split(x,x,z,val-1); 76 merge(z,tr[z].l,tr[z].r); 77 merge(x,x,z); 78 merge(root,x,y); 79 } 80 int pre(int &root,int val){ 81 int x=0,y=0; 82 split(root,x,y,val-1); 83 int ans=getvalbyrank(x,tr[x].size); 84 merge(root,x,y); 85 return ans; 86 } 87 int next(int &root,int val){ 88 int x=0,y=0; 89 split(root,x,y,val); 90 int ans=getvalbyrank(y,1); 91 merge(root,x,y); 92 return ans; 93 } 94 int main(){ 95 int n; 96 scanf("%d",&n); 97 for(int i=1;i<=n;i++){ 98 int opt,x; 99 scanf("%d%d",&opt,&x); 100 if(opt==1) insert(root,x); 101 else if(opt==2) remove(root,x); 102 else if(opt==3) printf("%d ",getrankbyval(root,x)); 103 else if(opt==4) printf("%d ",getvalbyrank(root,x)); 104 else if(opt==5) printf("%d ",pre(root,x)); 105 else if(opt==6) printf("%d ",next(root,x)); 106 } 107 }
明天考试,我好慌,我好慌。
马上分机房,我肯定去菜机房了,我好慌,我好慌。
加油吧,为了自己的梦想
Mi corazón pertenece a Barcelona para siempre.