hdu 4585 Shaolin

原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46093

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

 

转载于:https://www.cnblogs.com/GadyPu/p/4470897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值