• 各种平衡树板子


    Splay

      1 #include <cstdio>
      2 #include <iostream>
      3 using namespace std;
      4 const int maxn=1e5+5,inf=0x3f3f3f3f;
      5 int siz[maxn],fa[maxn],ch[maxn][2],rep[maxn],vl[maxn];
      6 int n,tot;
      7 
      8 inline int ids(int x) {return ch[fa[x]][0]==x?0:1;}
      9 
     10 inline void update(int x) {siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+rep[x];}
     11 
     12 inline void connect(int x,int f,int fs) {fa[x]=f;ch[f][fs]=x;}
     13 
     14 inline void rotate(const int &x)
     15 {
     16     int f=fa[x],ff=fa[fa[x]];
     17     int s1=ids(x),s2=ids(f);
     18     connect(ch[x][s1^1],f,s1);connect(f,x,s1^1);connect(x,ff,s2);
     19     update(f);update(x);
     20 }
     21 
     22 inline void splay(int x,int to)
     23 {
     24     while(fa[x]!=to)
     25     {
     26         if(fa[fa[x]]==to) rotate(x);
     27         else if(ids(fa[x])==ids(x)) rotate(fa[x]),rotate(x);
     28         else rotate(x),rotate(x);
     29     }
     30 }
     31 
     32 inline int cre(const int &val,const int &f) {fa[++n]=f;vl[n]=val;siz[n]=rep[n]=1;return n;}
     33 
     34 int find(int val)
     35 {
     36     int now=ch[0][0],nxt;
     37     while(1)
     38     {
     39         if(vl[now]==val){
     40             splay(now,0);
     41             return now;
     42         }
     43         nxt=val<vl[now]?0:1;
     44         if(!ch[now][nxt]) return 0;
     45         now=ch[now][nxt];
     46     }
     47 }
     48 
     49 void insert(int val)
     50 {
     51     tot++;
     52     if(!ch[0][0]) {ch[0][0]=cre(val,0);return;}
     53     int now=ch[0][0],nxt;
     54     while(1)
     55     {
     56         siz[now]++;
     57         if(val==vl[now]){
     58             rep[now]++;splay(now,0);return;
     59         }
     60         nxt=val<vl[now]?0:1;
     61         if(!ch[now][nxt])
     62         {
     63             ch[now][nxt]=cre(val,now);
     64             splay(ch[now][nxt],0);
     65             return;
     66         }
     67         now=ch[now][nxt];
     68     }
     69 }
     70 
     71 inline int lowe(int x)
     72 {
     73     int now=ch[0][0],ans=-inf;
     74     while(now){
     75         if(vl[now]<x&&vl[now]>ans) ans=vl[now];
     76         now=ch[now][x>vl[now]?1:0];
     77     }
     78     return ans;
     79 }
     80 
     81 inline int uppe(int x)
     82 {
     83     int now=ch[0][0],ans=inf;
     84     while(now){
     85         if(vl[now]>x&&vl[now]<ans) ans=vl[now];
     86         now=ch[now][x<vl[now]?0:1];
     87     }
     88     return ans;
     89 }
     90 
     91 void delt(int x)
     92 {
     93     tot--;
     94     int dl=find(x);
     95     if(!dl) return;
     96     if(rep[dl]>1) {siz[dl]--;rep[dl]--;return;}
     97     if(!ch[dl][0]) {connect(ch[dl][1],0,0);return;}
     98     if(!ch[dl][1]) {connect(ch[dl][0],0,0);return;}
     99     int px=ch[dl][0];
    100     while(ch[px][1]) px=ch[px][1];
    101     splay(px,dl);
    102     connect(ch[dl][1],px,1);connect(px,0,0);
    103     update(px);
    104 }
    105 
    106 int rk(int val)
    107 {
    108     int ans=0,now=ch[0][0];
    109     while(now)
    110     {
    111         if(vl[now]==val){
    112             ans+=siz[ch[now][0]]+1;break;
    113         }
    114         if(val<vl[now]) now=ch[now][0];
    115         else ans+=siz[ch[now][0]]+rep[now],now=ch[now][1];
    116     }
    117     splay(now,0);
    118     return ans;
    119 }
    120 
    121 int rrk(int x)
    122 {
    123     if(x>tot) return -inf;
    124     int now=ch[0][0],tmp;
    125     while(now)
    126     {
    127         tmp=rep[now]+siz[ch[now][0]];
    128         if(siz[ch[now][0]]<x&&x<=tmp) break;
    129         if(x<tmp) now=ch[now][0];
    130         else x-=tmp,now=ch[now][1];
    131     }
    132     splay(now,0);
    133     return vl[now];
    134 }
    135 
    136 int main()
    137 {
    138     int t,opt,x;
    139     scanf("%d",&t);
    140     for(int i=1;i<=t;i++)
    141     {
    142         scanf("%d%d",&opt,&x);
    143         switch(opt)
    144         {
    145             case 1: insert(x);break;
    146             case 2: delt(x);break;
    147             case 3: printf("%d
    ",rk(x));break;
    148             case 4: printf("%d
    ",rrk(x));break;
    149             case 5: printf("%d
    ",lowe(x));break;
    150             case 6: printf("%d
    ",uppe(x));break;
    151             default: break;
    152         }
    153     }
    154     return 0;
    155 }

    Fhq-treap

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <ctime>
      4 #include <cstdlib>
      5 using namespace std;
      6 const int maxn=1e5+5;
      7 struct Fhq_treep_Node
      8 {
      9     int val,siz,ch[2],rnd;
     10 }tr[maxn];
     11 int rt,r1,r2,r3,utot;
     12 
     13 inline void update(const int &u) {tr[u].siz=tr[tr[u].ch[0]].siz+tr[tr[u].ch[1]].siz+1;}
     14 inline int newnode(const int &val) {tr[++utot].val=val;tr[utot].siz=1;tr[utot].rnd=rand();return utot;}
     15 
     16 void split(int u,int val,int &a,int &b)
     17 {
     18     if(!u) {a=b=0;return;}
     19     if(tr[u].val<=val) a=u,split(tr[a].ch[1],val,tr[a].ch[1],b);
     20     else b=u,split(tr[b].ch[0],val,a,tr[b].ch[0]);
     21     update(u);
     22 }
     23 
     24 int merge(int a,int b)
     25 {
     26     if(!a||!b) return a+b;
     27     if(tr[a].rnd<tr[b].rnd){
     28         tr[a].ch[1]=merge(tr[a].ch[1],b);
     29         update(a);return a;
     30     }
     31     else{
     32         tr[b].ch[0]=merge(a,tr[b].ch[0]);
     33         update(b);return b;
     34     }
     35 }
     36 
     37 void insert(int val)
     38 {
     39     split(rt,val,r1,r2);
     40     rt=merge(r1,merge(newnode(val),r2));
     41 }
     42 
     43 void delt(int val)
     44 {
     45     split(rt,val,r1,r3);
     46     split(r1,val-1,r1,r2);
     47     r2=merge(tr[r2].ch[0],tr[r2].ch[1]);
     48     rt=merge(merge(r1,r2),r3);
     49 }
     50 
     51 int rnk(int val)
     52 {
     53     split(rt,val-1,r1,r2);
     54     int ans=tr[r1].siz+1;
     55     rt=merge(r1,r2);
     56     return ans;
     57 }
     58 
     59 int kth(int u,int k)
     60 {
     61     while(1)
     62     {
     63         if(tr[tr[u].ch[0]].siz>=k) u=tr[u].ch[0];
     64         else if(k>tr[tr[u].ch[0]].siz+1) k=k-tr[tr[u].ch[0]].siz-1,u=tr[u].ch[1];
     65         else return u;
     66     }
     67 }
     68 
     69 void lower(int val)
     70 {
     71     split(rt,val-1,r1,r2);
     72     printf("%d
    ",tr[kth(r1,tr[r1].siz)].val);
     73     rt=merge(r1,r2);
     74 }
     75 
     76 void upper(int val)
     77 {
     78     split(rt,val,r1,r2);
     79     printf("%d
    ",tr[kth(r2,1)].val);
     80     rt=merge(r1,r2);
     81 }
     82 
     83 int main()
     84 {
     85     srand(time(0));
     86     int opt,x,t;
     87     scanf("%d",&t);
     88     while(t--)
     89     {
     90         scanf("%d%d",&opt,&x);
     91         switch(opt)
     92         {
     93             case 1:insert(x);break;
     94             case 2:delt(x);break;
     95             case 3:printf("%d
    ",rnk(x));break;
     96             case 4:printf("%d
    ",tr[kth(rt,x)].val);break;
     97             case 5:lower(x);break;
     98             case 6:upper(x);break;
     99         }
    100     }
    101     return 0;
    102 }

    WBLT

      1 #include <cstdio>
      2 #include <iostream>
      3 using namespace std;
      4 const int ratio=3,inf=0x3f3f3f3f;
      5 
      6 struct Node
      7 {
      8     int siz,val;
      9     Node *ch[2];
     10     Node(int siz=0,int val=0) : siz(siz),val(val)
     11     {
     12         this->ch[0]=NULL;this->ch[1]=NULL;
     13     }
     14 };
     15 Node *rt;
     16 
     17 template<typename T>
     18 inline void read(T &x)
     19 {
     20     char c;int f=1;
     21     while(!isdigit(c=getchar())) (c=='-')&&(f=-1);
     22     x=c^48;
     23     while(isdigit(c=getchar())) x=x*10+(c^48);
     24     x*=f;
     25 }
     26 
     27 inline int min(int x,int y)
     28 {
     29     return x<y?x:y;
     30 }
     31 
     32 inline int max(int x,int y)
     33 {
     34     return x>y?x:y;
     35 }
     36 
     37 void merge(Node *u,Node *l,Node *r)
     38 {
     39     u->siz=l->siz+r->siz;
     40     u->val=r->val;
     41     u->ch[0]=l;u->ch[1]=r;
     42 }
     43 
     44 void rotate(Node *u,int s)
     45 {
     46     if(u->ch[0]==NULL||u->ch[s^1]->ch[0]==NULL) return;
     47     Node *now=new Node;
     48     if(!s) merge(now,u->ch[s],u->ch[s^1]->ch[s]);
     49     else merge(now,u->ch[s^1]->ch[s],u->ch[s]);
     50     u->ch[s]=now;
     51     now=u->ch[s^1]->ch[s^1];
     52     delete []u->ch[s^1];
     53     u->ch[s^1]=now;
     54 }
     55 
     56 void maintain(Node *u)
     57 {
     58     if(u->ch[0]==NULL) return;
     59     if(u->ch[0]->siz > u->ch[1]->siz*ratio)
     60         rotate(u,1);
     61     else if(u->ch[1]->siz > u->ch[0]->siz*ratio)
     62         rotate(u,0);
     63     if(u->ch[0]->siz > u->ch[1]->siz*ratio)
     64         rotate(u->ch[0],0),rotate(u,1);
     65     else if(u->ch[1]->siz > u->ch[0]->siz*ratio)
     66         rotate(u->ch[1],1),rotate(u,0);
     67 }
     68 
     69 void pushup(Node *u)
     70 {
     71     if(u->ch[0]==NULL) return;
     72     u->siz=u->ch[0]->siz+u->ch[1]->siz;
     73     u->val=u->ch[1]->val;
     74 }
     75 
     76 void insert(Node *u,int val)
     77 {
     78     //if((u->ch[0]==NULL&&u->ch[1]!=NULL)||(u->ch[0]!=NULL&&u->ch[1]==NULL)) puts("FUCK");
     79     if(u->ch[0]==NULL)
     80     {
     81         u->ch[0]=new Node(1,min(val,u->val));
     82         u->ch[1]=new Node(1,max(val,u->val));
     83         pushup(u);return;
     84     }
     85     maintain(u);
     86     insert(u->ch[val > u->ch[0]->val],val);
     87     pushup(u);
     88 }
     89 
     90 void erase(Node *u,int val,Node *f)
     91 {
     92     if(u->ch[0]==NULL)
     93     {
     94         int s=f->ch[1]==u;
     95         Node *now=f->ch[s^1];delete []f->ch[s];
     96         f->val=now->val;f->siz=now->siz;
     97         f->ch[0]=now->ch[0];f->ch[1]=now->ch[1];
     98         delete []now;
     99         return;
    100     }
    101     maintain(u);
    102     erase(u->ch[val > u->ch[0]->val],val,u);
    103     pushup(u);
    104 }
    105 
    106 int kth(int k)
    107 {
    108     Node *u=rt;
    109     while(u->ch[0]!=NULL)
    110     {
    111         maintain(u);
    112         if(u->ch[0]->siz < k) k-=u->ch[0]->siz,u=u->ch[1];
    113         else u=u->ch[0];
    114     }
    115     return u->val;
    116 }
    117 
    118 int rnk(Node *u,int x)
    119 {
    120     if(u->ch[0]==NULL) return 1;
    121     maintain(u);
    122     if(x > u->ch[0]->val) return rnk(u->ch[1],x)+u->ch[0]->siz;
    123     else return rnk(u->ch[0],x);
    124 }
    125 
    126 // void dfs(Node *u)
    127 // {
    128 //     if(u->siz==1) {printf("%d ",u->val);return;}
    129 //     dfs(u->ch[0]);dfs(u->ch[1]);
    130 // }
    131 
    132 int main()
    133 {
    134     int opt,x,t;
    135     read(t);
    136     rt=new Node(1,inf);
    137     while(t--)
    138     {
    139         read(opt);read(x);
    140         if(opt==1) insert(rt,x);
    141         else if(opt==2) erase(rt,x,NULL);
    142         else if(opt==3) printf("%d
    ",rnk(rt,x));
    143         else if(opt==4) printf("%d
    ",kth(x));
    144         else if(opt==5) printf("%d
    ",kth(rnk(rt,x)-1));
    145         else if(opt==6) printf("%d
    ",kth(rnk(rt,x+1)));
    146         //else dfs(rt),puts("");
    147     }
    148     return 0;
    149 }
  • 相关阅读:
    Java自带工具jstack故障分析的一个案例
    当spring 容器初始化完成后执行某个方法
    tomcat的maxThreads、acceptCount(最大线程数、最大排队数)
    RESTful API 设计指南
    GitHub简单使用入门
    Newton's method
    把一个文件夹下的多个excel文件合并到同一个excel的一个sheet里
    multimap的使用 in C++,同一个关键码存在多个值
    pandas把多个sheet读进一个DataFrame
    数据预处理之Minkowski距离计算
  • 原文地址:https://www.cnblogs.com/gxm123/p/12422416.html
Copyright © 2020-2023  润新知