码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4585 Shaolin

时间:2015-05-01 18:34:12      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

原题链接: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

 

hdu 4585 Shaolin

标签:

原文地址:http://www.cnblogs.com/GadyPu/p/4470897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!