poj 2153 Rank List
27286 ワード
原題リンク:http://poj.org/problem?id=2153 簡単な問題、map、バランスツリーでもいいです. map:
View Code
バランスツリー:
View Code
1 #include<algorithm>
2 #include<iostream>
3 #include<cstdlib>
4 #include<cstdio>
5 #include<string>
6 #include<map>
7 using std::cin;
8 using std::map;
9 using std::string;
10 map<string, int> ret;
11 int main() {
12 #ifdef LOCAL
13 freopen("in.txt", "r", stdin);
14 freopen("out.txt", "w+", stdout);
15 #endif
16 string buf;
17 int n, m, v, tmp;
18 while (cin >> n) {
19 getchar();
20 for (int i = 0; i < n; i++) {
21 getline(cin, buf);
22 ret[buf] = 0;
23 }
24 cin >> m;
25 while (m--) {
26 int ans = 0;
27 for (int i = 0; i < n; i++) {
28 cin >> v;
29 getchar();
30 getline(cin, buf);
31 ret[buf] += v;
32 }
33 tmp = ret["Li Ming"];
34 map<string, int>::iterator ite;
35 for (ite = ret.begin(); ite != ret.end(); ++ite) {
36 if (ite->second > tmp) ans++;
37 }
38 printf("%d
", ans + 1);
39 }
40 ret.clear();
41 }
42 return 0;
43 }
View Code
バランスツリー:
1 #include<algorithm>
2 #include<iostream>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cstdio>
6 typedef char State[35];
7 char *target = "Li Ming";
8 const int Max_N = 11000;
9 struct Node {
10 State name;
11 int data, s;
12 bool color;
13 Node *fa, *ch[2];
14 inline void set(int _v, char *src, bool _color, int i, Node *p) {
15 data = _v, color = _color, s = i;
16 fa = ch[0] = ch[1] = p;
17 strcpy(name, src);
18 }
19 inline void push_up() {
20 s = ch[0]->s + ch[1]->s + 1;
21 }
22 inline int cmp(char *src) const {
23 if (0 == strcmp(src, name)) return -1;
24 else if (-1 == strcmp(src, name)) return 0;
25 return 1;
26 }
27 };
28 struct RedBlackTree {
29 Node *root, *null;
30 Node stack[Max_N], *tail;
31 void init() {
32 tail = &stack[0];
33 null = tail++;
34 null->set(0, "", 0, 0, NULL);
35 root = null;
36 }
37 inline Node *newNode(char *name, int v) {
38 Node *p = tail++;
39 p->set(v, name, 1, 1, null);
40 return p;
41 }
42 inline void rotate(Node* &x, bool d) {
43 Node *y = x->ch[!d];
44 x->ch[!d] = y->ch[d];
45 if (y->ch[d] != null) y->ch[d]->fa = x;
46 y->fa = x->fa;
47 if (x->fa == null) root = y;
48 else x->fa->ch[x->fa->ch[0] != x] = y;
49 y->ch[d] = x;
50 x->fa = y;
51 y->s = x->s;
52 x->push_up();
53 }
54 inline void insert(char *name, int v = 0) {
55 int d = 0;
56 Node *x = root, *y = null;
57 while (x->s) {
58 x->s++;
59 d = x->cmp(name);
60 y = x, x = x->ch[d];
61 }
62 x = newNode(name, v);
63 if (y != null) { d = x->cmp(y->name), y->ch[!d] = x; }
64 else root = x;
65 x->fa = y;
66 insert_fix(x);
67 }
68 inline void insert_fix(Node* &x) {
69 while (x->fa->color){
70 Node *par = x->fa, *Gp = par->fa;
71 bool d = par == Gp->ch[0];
72 Node *uncle = Gp->ch[d];
73 if (uncle->color) {
74 par->color = uncle->color = 0;
75 Gp->color = 1;
76 x = Gp;
77 } else if (x == par->ch[d]) {
78 rotate(x = par, !d);
79 } else {
80 Gp->color = 1;
81 par->color = 0;
82 rotate(Gp, d);
83 }
84 }
85 root->color = 0;
86 }
87 inline Node *find(Node *x, char *name) {
88 while (x->s) {
89 int d = x->cmp(name);
90 if (-1 == d) break;
91 x = x->ch[d];
92 }
93 return x;
94 }
95 inline void Modify(char *str, int v) {
96 Node* ret = find(root, str);
97 ret->data += v;
98 }
99 inline void dfs(Node *x, int v, int &ans) {
100 if (x != null){
101 dfs(x->ch[0], v, ans);
102 if (x->data > v) ans++;
103 dfs(x->ch[1], v, ans);
104 }
105 }
106 inline void query() {
107 int cnt = 0, ans = 0;
108 int v = find(root, target)->data;
109 dfs(root, v, ans);
110 printf("%d
", ans + 1);
111 }
112 }rbt;
113 int main(){
114 #ifdef LOCAL
115 freopen("in.txt", "r", stdin);
116 freopen("out.txt", "w+", stdout);
117 #endif
118 char buf[100];
119 int n, m, val;
120 while (~scanf("%d
", &n)) {
121 rbt.init();
122 for (int i = 0; i < n; i++) {
123 gets(buf);
124 rbt.insert(buf);
125 }
126 scanf("%d
", &m);
127 while (m--) {
128 for (int i = 0; i < n; i++) {
129 gets(buf);
130 sscanf(buf, "%d", &val);
131 rbt.Modify(strchr(buf, ' ') + 1, val);
132 }
133 rbt.query();
134 }
135 }
136 return 0;
137 }
View Code