poj 2418 Hardwood Species,pojhardwood
原題鏈接: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