码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4006/AvlTree

时间:2015-04-24 22:31:54      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

原题链接: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] == null ? -1 : ch[0]->Height;
20         int t2 = ch[1] == null ? -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         k->s = x->s;
44         x->push_up();
45         x = k;
46     }
47     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     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     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 }Avl;
78 int main(){
79 #ifdef LOCAL  
80     freopen("in.txt", "r", stdin);
81     freopen("out.txt", "w+", stdout);
82 #endif  
83     char ch;
84     int i, n, k, d;
85     while (~scanf("%d %d", &n, &k)){
86         Avl.init();
87         for (i = 0; i < n; i++){
88             getchar();
89             scanf("%c", &ch);
90             if (I == ch)
91                 scanf("%d", &d), Avl.insert(Avl.root, d);
92             else 
93                 printf("%d\n", Avl.find_kth(Avl.root, Avl.root->s - k + 1));
94         }
95     }
96     return 0;
97 }
View Code

 

hdu 4006/AvlTree

标签:

原文地址:http://www.cnblogs.com/GadyPu/p/4454541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!