原题链接: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 }