hdu 4217 Data Structure?/treap

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 

可用线段树写,效率要高点。

这道题以前用c语言写的treap水过了。。

现在接触了c++重写一遍。。。

不带重复元素的插入删除第k大带垃圾回收,具体如下:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<iostream>
  4 #include<algorithm>
  5 typedef long long ll;
  6 const int MAX_N = 300100;
  7 struct Node{
  8     int v, s, fix;
  9     Node *ch[2];
 10     inline void 
 11     set(int _fix, int _v = 0, int _s = 0, Node *p = NULL){
 12         fix = _fix, v = _v, s = _s;
 13         ch[0] = ch[1] = p;
 14     }
 15     inline void push_up(){
 16         s = ch[0]->s + ch[1]->s + 1;
 17     }
 18 };
 19 int run(){
 20     static int x = 184082857;
 21     x += (x << 2) | 1;
 22     return x;
 23 }
 24 struct Treap{
 25     Node *tail, *null, *root;
 26     Node stack[MAX_N];
 27     int top;
 28     Node *store[MAX_N];
 29     void init(){
 30         tail = &stack[0];
 31         null = tail++;
 32         null->set(0x7fffffff);
 33         root = null;
 34         top = 0;
 35     }
 36     inline Node *newNode(int v){
 37         Node *p = null;
 38         if (top) p = store[--top];
 39         else p = tail++;
 40         p->set(run(), v, 1, null);
 41         return p;
 42     }
 43     inline void rotate(Node* &x, int d){
 44         Node *k = x->ch[!d];
 45         x->ch[!d] = k->ch[d];
 46         k->ch[d] = x;
 47         k->s = x->s;
 48         x->push_up();
 49         x = k;
 50     }
 51     inline void insert(Node* &x, int v){
 52         if (x == null){
 53             x = newNode(v);
 54             return;
 55         } else {
 56             int d = v > x->v;
 57             insert(x->ch[d], v);
 58             if (x->ch[d]->fix < x->fix) rotate(x, !d);
 59             x->push_up();
 60         }
 61     }
 62     inline void del(Node* &x, int v){
 63         if (x == null) return;
 64         x->s--;
 65         if (x->v == v){
 66             if (x->ch[0] == null || x->ch[1] == null){
 67                 store[top++] = x;
 68                 x = x->ch[0] == null ? x->ch[1] : x->ch[0];
 69             } else {
 70                 int d = x->ch[0]->fix < x->ch[1]->fix;
 71                 rotate(x, !d);
 72                 del(x->ch[!d], v);
 73             }
 74         } else {
 75             del(x->ch[v>x->v], v);
 76         }
 77         if (x != null) x->push_up();
 78     }
 79     inline int find_kth(Node *x, int k){
 80         int t = 0;
 81         for (;;){
 82             t = x->ch[0]->s;
 83             if (k == t + 1) break;
 84             else if (k < t + 1) x = x->ch[0];
 85             else k -= t + 1, x = x->ch[1];
 86         }
 87         return x->v;
 88     }
 89     inline void insert(int v){
 90         insert(root, v);
 91     }
 92     inline void del(int v){
 93         del(root, v);
 94     }
 95     inline int find_kth(int k){
 96         return find_kth(root, k);
 97     }
 98 }treap;
 99 int main(){
100 #ifdef LOCAL
101     freopen("in.txt", "r", stdin);
102     freopen("out.txt", "w+", stdout);
103 #endif
104     ll ans;
105     int t, n, m, k, tmp, c = 1;
106     scanf("%d", &t);
107     while (t--){
108         treap.init(), ans = 0;
109         scanf("%d %d", &n, &m);
110         for (int i = 1; i <= n; i++) treap.insert(i);
111         while (m--){
112             scanf("%d", &k);
113             ans += tmp = treap.find_kth(k);
114             treap.del(tmp);
115         }
116         printf("Case %d: %lld
", c++, ans);
117     }
118     return 0;
119 }
View Code
By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
原文地址:https://www.cnblogs.com/GadyPu/p/4454473.html