[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\n",S.lower_bound(x)); 152 if(op==4)printf("%d\n",S.get(x)); 153 if(op==5)printf("%d\n",S.get(S.lower_bound(x)-1)); 154 if(op==6)printf("%d\n",S.get(S.upper_bound(x))); 155 } 156 157 return 0; 158 }