【HDOJ】4585 Shaolin

Set可解,Treap也可解。
(1) Treap

  1 /*  */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23 
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41 
 42 typedef struct Node {
 43     Node* ch[2];
 44     int r, v, s, id;
 45 
 46     Node() {}
 47 
 48     Node(int v_, int id_) {
 49         ch[0] = ch[1] = NULL;
 50         r = rand();
 51         v = v_;
 52         id = id_;
 53         s = 1;
 54     }
 55 
 56     int cmp(int v_) const {
 57         if (v == v_)    return -1;
 58         return v<v_ ? 0:1;
 59     }
 60 
 61     friend bool operator< (const Node& a, const Node& b) {
 62         return a.r < b.r;
 63     }
 64 
 65     void maintain() {
 66         s = 1;
 67         if (ch[0] != NULL)    s += ch[0]->s;
 68         if (ch[1] != NULL)    s += ch[1]->s;
 69     }
 70 
 71 } Node;
 72 
 73 const int maxn = 1e5+5;
 74 const int maxm = 5e6+5;
 75 int id[maxm];
 76 Node* root;
 77 
 78 void rotate(Node*& o, int d) {
 79     Node* k = o->ch[d^1];
 80     o->ch[d^1] = k->ch[d];
 81     k->ch[d] = o;
 82     o->maintain();
 83     k->maintain();
 84     o = k;
 85 }
 86 
 87 void insert(Node*& o, int x, int id) {
 88     if (o == NULL) {
 89         o = new Node(x, id);
 90     } else {
 91         int d = x<o->v ? 0:1;
 92         insert(o->ch[d], x, id);
 93         if (o->ch[d]->r > o->r)
 94             rotate(o, d^1);
 95     }
 96     o->maintain();
 97 }
 98 
 99 void remove(Node*& o, int x) {
100     int d = o->cmp(x);
101 
102     if (d == -1) {
103         Node* u = o;
104         if (o->ch[0]!=NULL && o->ch[1]!=NULL) {
105             int d2 = o->ch[0]->r > o->ch[1]->r ? 1:0;
106             rotate(o, d2);
107             remove(o->ch[d2], x);
108         } else {
109             if (o->ch[0] == NULL)
110                 o = o->ch[1];
111             else
112                 o = o->ch[0];
113             delete u;
114         }
115     } else {
116         remove(o->ch[d], x);
117     }
118 
119     if (o != NULL)
120         o->maintain();
121 }
122 
123 void del(Node*& o) {
124     if (o->ch[0] != NULL)    del(o->ch[0]);
125     if (o->ch[1] != NULL)    del(o->ch[1]);
126     delete o;
127     o = NULL;
128 }
129 
130 int findK(Node* o, int x) {
131     if (o == NULL)
132         return -1;
133 
134     int d = o->cmp(x);
135     if (d == -1)
136         return (o->ch[0]==NULL ? 0:o->ch[0]->s) + 1;
137     if (d == 1) {
138         return findK(o->ch[0], x);
139     } else {
140         int tmp = findK(o->ch[1], x);
141         if (tmp < 0)
142             return -1;
143         tmp += (o->ch[0]==NULL ? 0:o->ch[0]->s) + 1;
144         return tmp;
145     }
146 }
147 
148 Node* kth(Node* o, int k) {
149     if (o==NULL || k<=0 || k>o->s)
150         return NULL;
151 
152     int s = o->ch[0]==NULL ? 0:o->ch[0]->s;
153     if (k == s+1)
154         return o;
155     else if (k <= s)
156         return kth(o->ch[0], k);
157     else
158         return kth(o->ch[1], k-s-1);
159 }
160 
161 int main() {
162     ios::sync_with_stdio(false);
163     #ifndef ONLINE_JUDGE
164         freopen("data.in", "r", stdin);
165         freopen("data.out", "w", stdout);
166     #endif
167 
168     int n, m;
169     int x, g, k;
170     int ans;
171     Node *gtp, *ltp;
172 
173     while (scanf("%d", &n)!=EOF && n) {
174         insert(root, 1e9, 1);
175         rep(i, 0, n) {
176             scanf("%d %d", &x, &g);
177             insert(root, g, x);
178             m = findK(root, g);
179             ltp = kth(root, m-1);
180             gtp = kth(root, m+1);
181             if (ltp != NULL) {
182                 if (gtp->v - g < g - ltp->v) {
183                     ans = gtp->id;
184                 } else {
185                     ans = ltp->id;
186                 }
187             } else {
188                 ans = gtp->id;
189             }
190             printf("%d %d\n", x, ans);
191         }
192         del(root);
193     }
194 
195     #ifndef ONLINE_JUDGE
196         printf("time = %d.\n", (int)clock());
197     #endif
198 
199     return 0;
200 }

(2)set

 1 /* 4585 */
 2 #include <iostream>
 3 #include <string>
 4 #include <map>
 5 #include <queue>
 6 #include <set>
 7 #include <stack>
 8 #include <vector>
 9 #include <deque>
10 #include <algorithm>
11 #include <cstdio>
12 #include <cmath>
13 #include <ctime>
14 #include <cstring>
15 #include <climits>
16 #include <cctype>
17 #include <cassert>
18 #include <functional>
19 #include <iterator>
20 #include <iomanip>
21 using namespace std;
22 //#pragma comment(linker,"/STACK:102400000,1024000")
23 
24 #define sti                set<int>
25 #define stpii            set<pair<int, int> >
26 #define mpii            map<int,int>
27 #define vi                vector<int>
28 #define pii                pair<int,int>
29 #define vpii            vector<pair<int,int> >
30 #define rep(i, a, n)     for (int i=a;i<n;++i)
31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
32 #define clr                clear
33 #define pb                 push_back
34 #define mp                 make_pair
35 #define fir                first
36 #define sec                second
37 #define all(x)             (x).begin(),(x).end()
38 #define SZ(x)             ((int)(x).size())
39 #define lson            l, mid, rt<<1
40 #define rson            mid+1, r, rt<<1|1
41 
42 const int maxn = 5e6+5;
43 int id[maxn];
44 
45 int main() {
46     ios::sync_with_stdio(false);
47     #ifndef ONLINE_JUDGE
48         freopen("data.in", "r", stdin);
49         freopen("data.out", "w", stdout);
50     #endif
51     
52     sti st;
53     sti::iterator iter;
54     int n;
55     int k, g, tmp;
56     
57     while (scanf("%d", &n)!=EOF && n) {
58         st.clr();
59         rep(i, 0, n) {
60             scanf("%d %d", &k, &g);
61             iter = st.lower_bound(g);
62             if (iter == st.end()) {
63                 if (iter == st.begin()) {
64                     printf("%d 1\n", k);
65                 } else {
66                     --iter;
67                     printf("%d %d\n", k, id[*iter]);
68                 }
69             } else {
70                 if (iter == st.begin()) {
71                     printf("%d %d\n", k, id[*iter]);
72                 } else {
73                     tmp = *iter;
74                     --iter;
75                     if (tmp-g < g-*iter) {
76                         printf("%d %d\n", k, id[tmp]);
77                     } else {
78                         printf("%d %d\n", k, id[*iter]);
79                     }
80                 }
81             }
82             id[g] = k;
83             st.insert(g);
84         }
85     }
86     
87     #ifndef ONLINE_JUDGE
88         printf("time = %d.\n", (int)clock());
89     #endif
90     
91     return 0;
92 }

 



posted on 2015-10-20 17:00  Bombe  阅读(150)  评论(0编辑  收藏  举报

导航