• splay学习笔记


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<string>
      4 #include<cstring>
      5 #include<cstdlib>
      6 using namespace std;
      7 const int N=100010;
      8 const int INF=0x3f3f3f3f;
      9 int son[N][2],fa[N],size[N],cnt[N],key[N],root,sz,n,op,x;
     10 #define ls son[x][0]
     11 #define rs son[x][1]
     12 inline void clear(int x){son[x][1]=son[x][0]=fa[x]=size[x]=cnt[x]=key[x]=0;return ;}
     13 inline bool get(int x){return son[fa[x]][1]==x;}
     14 inline void update(int x){
     15     if(x){
     16         size[x]=cnt[x];
     17         if(ls)size[x]+=size[ls];
     18         if(rs)size[x]+=size[rs];
     19     }
     20     return ;
     21 }
     22 inline void rotate(int x){
     23     int y=fa[x],z=fa[y],k=get(x);
     24     son[y][k]=son[x][k^1];fa[son[y][k]]=y;
     25     fa[x]=z;son[x][k^1]=y;fa[y]=x;
     26     if(z)son[z][son[z][1]==y]=x;
     27     update(y);update(x);return ;
     28 }
     29 inline void splay(int x){//double rotate
     30     for(int f;(f=fa[x]);rotate(x))
     31         if(fa[f])
     32             rotate((get(x)==get(f))?f:x);
     33     root=x;
     34 }
     35 inline void insert(int val){
     36     if(!root){root=++sz;size[sz]=cnt[sz]=1;key[sz]=val;son[sz][1]=son[sz][0]=fa[sz]=0;return ;}
     37     int now=root,f=0;
     38     while(1){
     39         if(key[now]==val){cnt[now]++;update(now);update(f);splay(now);return ;}
     40         f=now;now=son[now][key[now]<val];
     41         if(!now){
     42             now=++sz;son[f][key[f]<val]=sz;fa[sz]=f;key[sz]=val;
     43             size[sz]=cnt[sz]=1;son[sz][1]=son[sz][0]=0;
     44             update(f);splay(sz);return ;
     45         }
     46     }
     47 }
     48 int find(int x,int val){
     49     if(key[x]==val)return x;
     50     if(key[x]>val)return find(ls,val);
     51     if(key[x]<val)return find(rs,val);
     52 }
     53 inline int Rank (int x ) {
     54     splay(find(root,x));
     55     return size[son[root][0]]+1;
     56 }
     57 inline int Kth(int x,int k){
     58     if(size[ls]>=k)return Kth(ls,k);
     59     if(size[ls]+cnt[x]>=k)return key[x];
     60     else return Kth(rs,k-size[ls]-cnt[x]);
     61 }
     62 inline int Pre(int x,int val){
     63     if(!x)return -INF;
     64     if(key[x]<val)return max(key[x],Pre(rs,val));
     65     if(key[x]>=val)return Pre(ls,val);
     66 }
     67 inline int Nxt(int x,int val){
     68     if(!x)return INF;
     69     if(key[x]>val)return min(key[x],Nxt(ls,val));
     70     if(key[x]<=val)return Nxt(rs,val);
     71 }
     72 inline void Del(int val){
     73     splay(find(root,val));int old=root;
     74     if(cnt[root]>1){cnt[root]--;update(root);return;}
     75     if(!son[root][1]&&!son[root][0]){clear(root);root=0;return ;}
     76     if(!son[root][1]){root=son[root][0];fa[root]=0;update(root);clear(old);return ;}
     77     if(!son[root][0]){root=son[root][1];fa[root]=0;update(root);clear(old);return ;}
     78     splay(find(root,Pre(root,val)));
     79     son[root][1]=son[old][1];fa[son[old][1]]=root;
     80     clear(old);update(root);return ;
     81 }
     82 int main()
     83 {
     84     scanf("%d",&n);
     85     while(n--){
     86         scanf("%d%d",&op,&x);
     87         switch(op){
     88             case 1:insert(x);break;
     89             case 2:Del(x);break;
     90             case 3:printf("%d
    ",Rank(x));break;
     91             case 4:printf("%d
    ",Kth(root,x));break;
     92             case 5:printf("%d
    ",Pre(root,x));break;
     93             case 6:printf("%d
    ",Nxt(root,x));break;
     94         }
     95     }
     96     return 0;
     97 }
     98 
     99 
    100 /*update的其他操作 
    101         sum[x]=sum[ls]+sum[rs]+key[x];
    102         mul[x]=mul[ls]*key[x]*mul[rs]%mod;
    103         */
    104         
    105 //inline void splay(int x,int goal){//double rotate
    106 //    for(int f;(f=fa[x])!=goal;rotate(x))
    107 //        if(fa[f]!=goal)
    108 //            rotate((get(x)==get(f))?f:x);
    109 //    if(!goal)root=x;
    110 //}定向双旋
    View Code
  • 相关阅读:
    第四周课下作业
    # 20165206 2017-2018-2 《Java程序设计》第4周学习总结
    20165206 2017-2018-2 《Java程序设计》第三周学习总结
    20165206 2017-2018-2 《Java程序设计》第二周学习总结
    第一周学习总结
    20165206 预备作业3 Linux安装及学习
    20165206学习基础和C语言基础调查
    20165206 我期望的师生关系
    channelartlist标签调用实例
    dede如何按自己写的ID进行排序
  • 原文地址:https://www.cnblogs.com/chiyo/p/11095491.html
Copyright © 2020-2023  润新知