hdu 4006/AvlTree

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

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

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

由于没有删除操作故不带垃圾回收,具体如下:

 

  1 #include<cstdio>

  2 #include<cstdlib>

  3 #include<iostream>

  4 #define Max_N 1000100

  5 inline int max(int &a, int &b){

  6     return a > b ? a : b;

  7 }

  8 struct Node *null;

  9 struct Node{

 10     int v, s, Height;

 11     Node *ch[2];

 12     inline void

 13         set(int H = 0, int _v = 0, int _s = 0, Node *p = NULL){

 14             v = _v, s = _s, Height = H;

 15             ch[0] = ch[1] = p;

 16         }

 17     inline void push_up(){

 18         s = ch[0]->s + ch[1]->s + 1;

 19         int t1 = !ch[0]->s ? -1 : ch[0]->Height;

 20         int t2 = !ch[1]->s ? -1 : ch[1]->Height;

 21         Height = max(t1, t2) + 1;

 22     }

 23 };

 24 struct AvlTree{

 25     Node *tail, *root;

 26     Node stack[Max_N];

 27     int top;

 28     void init(){

 29         tail = &stack[0];

 30         null = tail++;

 31         null->set();

 32         root = null;

 33     }

 34     Node *newNode(int v){

 35         Node *p = tail++;

 36         p->set(0, v, 1, null);

 37         return p;

 38     }

 39     inline void rotate(Node* &x, int d){

 40         Node *k = x->ch[!d];

 41         x->ch[!d] = k->ch[d];

 42         k->ch[d] = x;

 43         x->push_up();

 44         k->push_up();

 45         x = k;

 46     }

 47     inline void Maintain(Node* &x, int d){

 48         if (x->ch[d]->Height - x->ch[!d]->Height == 2){

 49             if (x->ch[d]->ch[d]->Height - x->ch[d]->ch[!d]->Height == 1){

 50                 rotate(x, !d);

 51             } else if (x->ch[d]->ch[d]->Height - x->ch[d]->ch[!d]->Height == -1){

 52                 rotate(x->ch[d], d), rotate(x, !d);

 53             }

 54         }

 55     }

 56     inline void insert(Node* &x, int v){

 57         if (x == null){

 58             x = newNode(v);

 59             return;

 60         } else {

 61             int d = v > x->v;

 62             insert(x->ch[d], v);

 63             x->push_up();

 64             Maintain(x, d);

 65         }

 66     }

 67     inline int find_kth(Node *x, int k){

 68         int t = 0;

 69         for (; x != null;){

 70             t = x->ch[0]->s;

 71             if (k == t + 1) break;

 72             else if (k <= t) x = x->ch[0];

 73             else k -= t + 1, x = x->ch[1];

 74         }

 75         return x->v;

 76     }

 77     inline void insert(int v){

 78         insert(root, v);

 79     }

 80     inline void find_kth(int k){

 81         printf("%d\n", find_kth(root, root->s - k + 1));

 82     }

 83 }Avl;

 84 int main(){

 85 #ifdef LOCAL  

 86     freopen("in.txt", "r", stdin);

 87     freopen("out.txt", "w+", stdout);

 88 #endif  

 89     char ch;

 90     int i, n, k, d;

 91     while (~scanf("%d %d", &n, &k)){

 92         Avl.init();

 93         for (i = 0; i < n; i++){

 94             getchar();

 95             scanf("%c", &ch);

 96             if ('I' == ch) scanf("%d", &d), Avl.insert(d);

 97             else Avl.find_kth(k);

 98         }

 99     }

100     return 0;

101 }
View Code

 

你可能感兴趣的:(tree)