原題鏈接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46093
1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 #include<algorithm> 5 const int Max_N = 101000; 6 const int INF = 0x7fffffff; 7 struct Node{ 8 int v, id, s; 9 Node *ch[2]; 10 inline void 11 set(int _v = 0, int _id = 0, int _s = 0, Node *p = NULL){ 12 ch[0] = ch[1] = p; 13 v = _v, id = _id, s = _s; 14 } 15 inline void push_up(){ 16 s = ch[0]->s + ch[1]->s + 1; 17 } 18 inline int cmp(int x) const{ 19 return x > v; 20 } 21 }; 22 struct SizeBalanceTree{ 23 Node *tail, *root, *null; 24 Node stack[Max_N]; 25 void init(){ 26 tail = &stack[0]; 27 null = tail++; 28 null->set(); 29 root = null; 30 } 31 inline Node *newNode(int v, int id){ 32 Node *p = tail++; 33 p->set(v, id, 1, null); 34 return p; 35 } 36 inline void rotate(Node* &x, int d){ 37 Node *k = x->ch[!d]; 38 x->ch[!d] = k->ch[d]; 39 k->ch[d] = x; 40 k->s = x->s; 41 x->push_up(); 42 x = k; 43 } 44 inline void Maintain(Node* &x, int d){ 45 if (x->ch[d] == null) return; 46 if (x->ch[d]->ch[d]->s > x->ch[!d]->s){ 47 rotate(x, !d); 48 } else if (x->ch[d]->ch[!d]->s > x->ch[!d]->s){ 49 rotate(x->ch[d], d), rotate(x, !d); 50 } else { 51 return; 52 } 53 Maintain(x, 0), Maintain(x, 1); 54 } 55 inline void insert(Node* &x, int v, int id){ 56 if (x == null){ 57 x = newNode(v, id); 58 return; 59 } else { 60 x->s++; 61 int d = x->cmp(v); 62 insert(x->ch[d], v, id); 63 x->push_up(); 64 Maintain(x, d); 65 } 66 } 67 inline void insert(int v, int id){ 68 insert(root, v, id); 69 } 70 inline Node *select(Node *x, int v, int dx){ 71 Node *pre = null; 72 while (x != null && x->v != v){ 73 int d = x->cmp(v); 74 if (d == !dx) pre = x; 75 x = x->ch[d]; 76 } 77 x = x->ch[dx]; 78 if (x == null){ 79 return pre; 80 } else { 81 while (x->ch[!dx] != null) x = x->ch[!dx]; 82 return x; 83 } 84 } 85 inline int calc(Node *r, int k) { 86 if (r == null) return INF; 87 return std::abs(r->v - k); 88 } 89 inline void gogo(int id, int v){ 90 int ans = 0; 91 Node *k1 = select(root, v, 0); 92 Node *k2 = select(root, v, 1); 93 int d1 = calc(k1, v), d2 = calc(k2, v); 94 ans = d1 > d2 ? k2->id : k1->id; 95 printf("%d %d\n", id, ans); 96 } 97 }sbt; 98 int main(){ 99 #ifdef LOCAL 100 freopen("in.txt", "r", stdin); 101 freopen("out.txt", "w+", stdout); 102 #endif 103 int n, id, v; 104 while (~scanf("%d", &n) && n){ 105 sbt.init(); 106 sbt.insert((int)1e9, 1); 107 for (int i = 0; i < n; i++){ 108 scanf("%d %d", &id, &v); 109 sbt.insert(v, id); 110 sbt.gogo(id, v); 111 } 112 } 113 return 0; 114 } View Code