• 模板—treap


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #define INF 0x7fffffff
      5 using namespace std ;
      6 struct treap
      7 {
      8     int l,r,val,dat,cnt,size;
      9     #define l(x) tr[x].l
     10     #define r(x) tr[x].r
     11     #define val(x) tr[x].val
     12     #define dat(x) tr[x].dat
     13     #define cnt(x) tr[x].cnt
     14     #define size(x) tr[x].size
     15 }tr[10000010];
     16 int tot,root,n;
     17 
     18 int New(int val)
     19 {
     20     ++tot;
     21     val(tot)=val;
     22     dat(tot)=rand();
     23     size(tot)=cnt(tot)=1;
     24     return tot;
     25 }
     26 void updata(int x)
     27 {
     28     size(x)=cnt(x)+size(l(x))+size(r(x));
     29 }
     30 void build()
     31 {
     32     New(-INF),New(INF);
     33     root=1;
     34     r(1)=2;
     35     updata(root);
     36 }
     37 void zig(int &p)//you
     38 {
     39     int q=l(p);
     40     l(p)=r(q);
     41     r(q)=p;
     42     updata(p),updata(q);
     43     p=q;
     44 }
     45 void zag(int &p)//zuo
     46 {
     47     int q=r(p);
     48     r(p)=l(q);
     49     l(q)=p;
     50     updata(p),updata(q);
     51     p=q;
     52 }
     53 int grbv(int p,int val)
     54 {
     55     if(!p)return 0;
     56     if(val==val(p))return size(l(p))+1;
     57     if(val(p)>val) return grbv(l(p),val);
     58     return grbv(r(p),val)+size(l(p))+cnt(p);
     59 }
     60 int gvbr(int p,int rank)
     61 {
     62     if(!p)return INF;
     63     if(size(l(p))>=rank)return gvbr(l(p),rank);
     64     if(size(l(p))+cnt(p)>=rank)return val(p);
     65     return gvbr(r(p),rank-size(l(p))-cnt(p));
     66 }
     67 void insert(int &p,int val)
     68 {
     69     if(!p){p=New(val);return;}
     70     if(val(p)==val){cnt(p)++;updata(p);return;}
     71     if(val(p)>val)
     72     {
     73         insert(l(p),val);
     74         if(dat(l(p))>dat(p))zig(p);
     75     }
     76     else
     77     {
     78         insert(r(p),val);
     79         if(dat(r(p))>dat(p))zag(p);
     80     }    
     81     updata(p);
     82 }
     83 void remove(int &p,int val)
     84 {
     85     if(!p)return;
     86     if(val(p)==val)
     87     {
     88         if(cnt(p)>1){cnt(p)--;updata(p);return;}
     89         if(l(p) || r(p))
     90         {
     91             if(r(p)==0 || dat(l(p))>dat(r(p)))    
     92                 zig(p),remove(r(p),val);
     93             else
     94                 zag(p),remove(l(p),val);
     95             updata(p);
     96         }
     97         else p=0;
     98         return;
     99     }
    100     val<val(p)?remove(l(p),val):remove(r(p),val);
    101     updata(p);
    102 }
    103 int getpre(int val)
    104 {
    105     int ans=1,p=root;
    106     while(p)
    107     {
    108         if(val(p)==val)
    109         {
    110             if(l(p)>0) 
    111             {
    112                 p=l(p);
    113                 while(r(p)>0)p=r(p);
    114                 ans=p;
    115             }
    116             break;
    117         }
    118         if(val(p)<val && val(p)>val(ans))ans=p;
    119         p=val<val(p)?l(p):r(p);
    120     }
    121     return val(ans);
    122 }
    123 int getnext(int val)
    124 {
    125     int ans=2,p=root;
    126     while(p)
    127     {
    128         if(val(p)==val)
    129         {
    130             if(r(p)>0)
    131             {
    132                 p=r(p);
    133                 while(l(p)>0)p=l(p);
    134                 ans=p;
    135             }
    136             break;
    137         }
    138         if(val(p)>val && val(p)<val(ans))ans=p;
    139         p=val<val(p)?l(p):r(p);
    140     }
    141     return val(ans);
    142 }
    143 signed main()
    144 {
    145 //    freopen("input2.in","r",stdin);
    146     
    147     build();
    148     cin>>n;
    149     int  opt,x;
    150     for(int i=1;i<=n;i++)
    151     {
    152         cin>>opt>>x;
    153         if(opt==1)insert(root,x);
    154         if(opt==2)remove(root,x);
    155         if(opt==3)cout<<grbv(root,x)-1<<endl;
    156         if(opt==4)cout<<gvbr(root,x+1)<<endl;
    157         if(opt==5)cout<<getpre(x)<<endl;
    158         if(opt==6)cout<<getnext(x)<<endl;
    159     }
    160 }
    波澜前,面不惊。
  • 相关阅读:
    转载别人(ZZ)创建要素集
    CAD转化为Shp
    VBS学习
    3度带/6度带
    头文件学习,GEOTIFF
    arcmap vba 生成3维侧棱 以及 createfeature与createfeaturebuffer的区别
    另类
    幸福人生讲座(七):怎样引导孩子立志
    幸福人生讲座(四):孝道与仁爱是根本
    幸福人生讲座(二):人生怎样才能幸福?
  • 原文地址:https://www.cnblogs.com/Al-Ca/p/11018191.html
Copyright © 2020-2023  润新知