fhq Treap(无旋Treap)

时间:2019-06-13
本文章向大家介绍fhq Treap(无旋Treap),主要包括fhq Treap(无旋Treap)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸。

昨天treap就搞了一下午,感觉自己弱爆了。然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz。

所以写个博客防止自己忘了吧(其实就是贴个代码)

其实fhq treap中最重要的操作就是split和merge,这样就避免了普通treap中的zig和zag,而且各种查询十分方便,基本查个排名就出来了。

  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\n",getrankbyval(root,x));
103         else if(opt==4) printf("%d\n",getvalbyrank(root,x));
104         else if(opt==5) printf("%d\n",pre(root,x));
105         else if(opt==6) printf("%d\n",next(root,x));
106     }
107 }
View Code

明天考试,我好慌,我好慌。

马上分机房,我肯定去菜机房了,我好慌,我好慌。

加油吧,为了自己的梦想

Mi corazón pertenece a Barcelona para siempre.

原文地址:https://www.cnblogs.com/leom10/p/11015089.html