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 ", x, ans); 191 } 192 del(root); 193 } 194 195 #ifndef ONLINE_JUDGE 196 printf("time = %d. ", (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 ", k); 65 } else { 66 --iter; 67 printf("%d %d ", k, id[*iter]); 68 } 69 } else { 70 if (iter == st.begin()) { 71 printf("%d %d ", k, id[*iter]); 72 } else { 73 tmp = *iter; 74 --iter; 75 if (tmp-g < g-*iter) { 76 printf("%d %d ", k, id[tmp]); 77 } else { 78 printf("%d %d ", 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. ", (int)clock()); 89 #endif 90 91 return 0; 92 }