poj 2418 Hardwood Species

原题链接:http://poj.org/problem?id=2418

简单题。。

平衡树,写了个模板。。动态分配内存确实很慢。。。

 

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<string>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<cstdio>
  7 using std::string;
  8 template<typename T>
  9 class sb_tree{
 10 private:
 11     struct Node{
 12         T data;
 13         int s, c;
 14         Node *ch[2];
 15         Node(const T&d) :s(1), c(1), data(d){}
 16         Node() :s(0), c(0){ ch[0] = ch[1] = this; }
 17         inline void push_up(){
 18             s = ch[0]->s + ch[1]->s + c;
 19         }
 20         inline int cmp(const T&v) const{
 21             return v == data ? -1 : v > data;
 22         }
 23     }*null, *root;
 24     inline void rotate(Node* &x, int d){
 25         Node *k = x->ch[!d];
 26         x->ch[!d] = k->ch[d];
 27         k->ch[d] = x;
 28         k->s = x->s;
 29         x->push_up();
 30         x = k;
 31     }
 32     inline void Maintain(Node* &x, int d){
 33         if (x->ch[d] == null) return;
 34         if (x->ch[d]->ch[d]->s > x->ch[!d]->s){
 35             rotate(x, !d);
 36         } else if (x->ch[d]->ch[!d]->s > x->ch[!d]->s){
 37             rotate(x->ch[d], d), rotate(x, !d);
 38         } else {
 39             return;
 40         }
 41         Maintain(x, 0), Maintain(x, 1);
 42     }
 43     inline void insert(Node *&x, const T&data){
 44         if (!x->s){
 45             x = new Node(data);
 46             x->ch[0] = x->ch[1] = null;
 47         } else{
 48             x->s++;
 49             int d = x->cmp(data);
 50             if (-1 == d){
 51                 x->c++;
 52                 return;
 53             }
 54             insert(x->ch[d], data);
 55             x->push_up();
 56             Maintain(x, d);
 57         }
 58     }
 59     inline void del(Node *&x, const T&data){
 60         if (!x->s) return ;
 61         x->s--;
 62         int d = x->cmp(data);
 63         if (-1 == d){
 64             if (x->c > 1){
 65                 x->c--;
 66                 return;
 67             } else if (!x->ch[0]->s || !x->ch[1]->s){
 68                 x = x->ch[0]->s ? x->ch[0] : x->ch[1];
 69             } else {
 70                 Node *ret = x->ch[1];
 71                 for (; ret->ch[0]->s; ret = ret->ch[0]);
 72                 del(x->ch[1], x->data = ret->data);
 73             }
 74         } else {
 75             del(x->ch[d], data);
 76         }
 77         if (x->s) x->push_up();
 78     }
 79     void clear(Node* &x){
 80         if (x->s) clear(x->ch[0]), clear(x->ch[1]), delete x;
 81     }
 82 public:
 83     sb_tree() :null(new Node), root(null){}
 84     ~sb_tree(){ clear(root), delete null; }
 85     inline void clear(){ clear(root), root = null; }
 86     inline void insert(const T&data){
 87         insert(root, data);
 88     }
 89     inline void del(const T&data){
 90         del(root, data);
 91     }
 92     inline bool find(const T&data){
 93         Node *x = root;
 94         while (x->s && x->data != data) x = x->ch[x->data < data];
 95         return x->s;
 96     }
 97     inline const T&kth(int k){
 98         Node *x = root;
 99         for (int t = 0; x != null;){
100             t = x->ch[0]->s;
101             if (k <= t) x = x->ch[0];
102             else if (t + 1 <= k && k <= t + x->c) break;
103             else k -= t + x->c, x = x->ch[1];
104         }
105         return x->data;
106     }
107     inline int rank(const T&data){
108         Node *x = root;
109         int t = 0, cur = 0;
110         for (cur = 0; x != null;){
111             t = x->ch[0]->s;
112             if (data == x->data) break;
113             else if (data < x->data) x = x->ch[0];
114             else cur += t + x->c, x = x->ch[1];
115         }
116         return cur + t + 1;
117     }
118     inline const T&operator[](int k){
119         return kth(k);
120     }
121     inline const T&preorder(const T&data){
122         Node *x = root, *y = 0;
123         while (x->s){
124             if (x->data < data) y = x, x = x->ch[1];
125             else x = x->ch[0];
126         }
127         return y ? y->data : data;
128     }
129     inline const T&successor(const T&data){
130         Node *x = root, *y = 0;
131         while (x->s){
132             if (data < x->data) y = x, x = x->ch[0];
133             else x = x->ch[1];
134         }
135         return y ? y->data : data;
136     }
137     inline int size(){ return root->s; }
138     inline void query(Node *x, int cnt){
139         if (x != null){
140             query(x->ch[0], cnt);
141             string str = x->data;
142             printf("%s %.4lf\n", str.c_str(), (double)x->c * 100 / cnt);
143             query(x->ch[1], cnt);
144         }
145     }
146     inline void query(){
147         int cnt = size();
148         query(root, cnt);
149     }
150 };
151 int main(){
152 #ifdef LOCAL
153     freopen("in.txt", "r", stdin);
154     freopen("out.txt", "w+", stdout);
155 #endif
156     char buf[100];
157     sb_tree<string> ans;
158     while (gets(buf)) ans.insert(buf);
159     ans.query();
160     return 0;
161 }
View Code

 

如果不想写平衡树,就写个快排吧。。注意用c提交:

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 typedef char State[33];
 5 State st[1000010];
 6 int cmp(const char* src, const char *_src){
 7     return strcmp((char *)src, (char *)_src);
 8 }
 9 int main(){
10     State ret, buf;
11     int i, k, cnt = 0;
12     while (gets(ret)) strcpy(st[cnt++], ret);
13     qsort(st, cnt, sizeof(st[0]), cmp);
14     i = 0;
15     while (i < cnt){
16         strcpy(buf, st[i]), k = 0;
17         for (; 0 == strcmp(buf, st[i]); i++) k++;
18         printf("%s %.4lf\n", buf, (double)k * 100 / cnt);
19     }
20     return 0;
21 }
View Code

 

posted @ 2015-05-05 20:02  GadyPu  阅读(201)  评论(0编辑  收藏  举报