zoukankan      html  css  js  c++  java
  • [bzoj3224]普通平衡树[Treap]

    Treap 的各种操作,模板题,要再写几遍

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <cstdlib>
      5 #include <cstring>
      6 #include <cmath>
      7 #include <ctime>
      8 
      9 using namespace std;
     10 
     11 class    Treap
     12 {
     13     private:
     14         struct Treap_Point
     15         {
     16             int    l,r,val,size,key,num;
     17             Treap_Point(){l=r=val=size=key=num=0;}
     18         };
     19         Treap_Point    d[210000];
     20         int    root,cnt;
     21         pair<int,int>    tmp;
     22 
     23         void    update(const int t)
     24         {
     25             d[t].size=d[d[t].l].size+
     26                 d[d[t].r].size+d[t].num;
     27             return ;
     28         }
     29 
     30         void    turn_R(int & t)
     31         {
     32             int    temp=d[t].l;d[t].l=d[temp].r;d[temp].r=t;
     33             d[temp].size=d[t].size;update(t);t=temp;return ;
     34         }
     35 
     36         void    turn_L(int & t)
     37         {
     38             int    temp=d[t].r;d[t].r=d[temp].l;d[temp].l=t;
     39             d[temp].size=d[t].size;update(t);t=temp;return ;
     40         }
     41 
     42         void    insert(int & t,const int x)
     43         {
     44             if(!t)
     45             {
     46                 cnt++;t=cnt;d[t].size=d[t].num=1;
     47                 d[t].val=x,d[t].key=rand();
     48                 return ;
     49             }
     50             d[t].size++;
     51             if(d[t].val==x)d[t].num++;
     52             else if(x<=d[t].val)
     53             {
     54                 insert(d[t].l,x);
     55                 if(d[d[t].l].key<d[t].key)turn_R(t);
     56             }
     57             else
     58             {
     59                 insert(d[t].r,x);
     60                 if(d[d[t].r].key<d[t].key)turn_L(t);
     61             }
     62             return ;
     63         }
     64 
     65         void    erase(int & t,const int x)
     66         {
     67             if(!t)return ;
     68             if(d[t].val==x)
     69             {
     70                 if(d[t].num>1)
     71                 {
     72                     d[t].num--;d[t].size--;return ;
     73                 }
     74                 if(d[t].l*d[t].r==0)t=d[t].l+d[t].r;
     75                 else if(d[d[t].l].key<d[d[t].r].key)
     76                     turn_R(t),erase(t,x);
     77                 else 
     78                     turn_L(t),erase(t,x);
     79             }
     80             else if(x<=d[t].val)d[t].size--,erase(d[t].l,x);
     81             else    d[t].size--,erase(d[t].r,x);
     82             return ;
     83         }
     84 
     85         int    get(const int & t,const int x)
     86         {
     87             if(t==0)return 0;
     88             if(x<=d[d[t].l].size)return get(d[t].l,x);
     89             else if(x>d[d[t].l].size+d[t].num)
     90                 return get(d[t].r,x-d[d[t].l].size-d[t].num);
     91             return d[t].val;
     92         }
     93 
     94         int    upper_bound(const int & t,const int x,const int step)
     95         {
     96             if(t==0)return 0;
     97             if(x<d[t].val)tmp=min(tmp,make_pair(d[t].val,step));
     98             if(x>=d[t].val)upper_bound(d[t].r,x,step+d[d[d[t].r].l].size+d[t].num);
     99             else    upper_bound(d[t].l,x,step-d[d[d[t].l].r].size-d[d[t].l].num);
    100             return tmp.second;
    101         }
    102 
    103         int    lower_bound(const int & t,const int x,const int step)
    104         {
    105             if(t==0)return 0;
    106             if(x<=d[t].val)tmp=min(tmp,make_pair(d[t].val,step));
    107             if(x>d[t].val)lower_bound(d[t].r,x,step+d[d[d[t].r].l].size+d[t].num);
    108             else    lower_bound(d[t].l,x,step-d[d[d[t].l].r].size-d[d[t].l].num);
    109             return tmp.second;
    110         }
    111 
    112     public:
    113         void    insert(const int x)
    114         {
    115             insert(root,x);
    116         }
    117         void    erase(const int x)
    118         {
    119             erase(root,x);
    120         }
    121         int    get(const int x)
    122         {
    123             return get(root,x);
    124         }
    125         int    upper_bound(const int x)
    126         {
    127             tmp=make_pair(0x7fffffff,0);
    128             return upper_bound(root,x,d[d[root].l].size+1);
    129         }
    130         int    lower_bound(const int x)
    131         {
    132             tmp=make_pair(0x7fffffff,0);
    133             return lower_bound(root,x,d[d[root].l].size+1);
    134         }
    135 }S;
    136 
    137 int    n;
    138         
    139 int main()
    140 {
    141     int    i,op,x;
    142 
    143     scanf("%d",&n);
    144 
    145     S.insert(0x7ffffff0);
    146     for(i=1;i<=n;++i)
    147     {
    148         scanf("%d%d",&op,&x);
    149         if(op==1)S.insert(x);
    150         if(op==2)S.erase(x);
    151         if(op==3)printf("%d
    ",S.lower_bound(x));
    152         if(op==4)printf("%d
    ",S.get(x));
    153         if(op==5)printf("%d
    ",S.get(S.lower_bound(x)-1));
    154         if(op==6)printf("%d
    ",S.get(S.upper_bound(x)));
    155     }
    156 
    157     return 0;
    158 }
  • 相关阅读:
    42.数据库表转model类
    第一篇 变量及数据类型
    第七十四篇 web应用本质与django基础
    第七十三篇 jq进阶与bootstrap了解
    第七十二篇 jquery基础
    第七十一篇 js进阶之事件、页面操作
    第七十篇 js基础
    第六十九篇 css之显隐、定位
    第六十七篇 css样式与布局
    第六十六篇 前端基础一
  • 原文地址:https://www.cnblogs.com/Gster/p/5090512.html
Copyright © 2011-2022 走看看