zoukankan      html  css  js  c++  java
  • hdu 1908 Double Queue

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=1908

    Double Queue

    Description

    The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest, equipped with a modern computing environment provided by IBM Romania, and using modern information technologies. As usual, each client of the bank is identified by a positive integer K and, upon arriving to the bank for some services, he or she receives a positive integer priority P. One of the inventions of the young managers of the bank shocked the software engineer of the serving system. They proposed to break the tradition by sometimes calling the serving desk with the lowest priority instead of that with the highest priority. Thus, the system will receive the following types of request:

    Your task is to help the software engineer of the bank by writing a program to implement the requested serving policy.

    Input

    Each line of the input contains one of the possible requests; only the last line contains the stop-request (code 0). You may assume that when there is a request to include a new client in the list (code 1), there is no other request in the list of the same client or with the same priority. An identifier K is always less than $10^6$, and a priority P is less than $10^7$. The client may arrive for being served multiple times, and each time may obtain a different priority.

    Output

    For each request with code 2 or 3, the program has to print, in a separate line of the standard output, the identifier of the served client. If the request arrives when the waiting list is empty, then the program prints zero (0) to the output.

    SampleInput

    2
    1 20 14
    1 30 3
    2
    1 10 99
    3
    2
    2
    0

    SampleOutput

    0
    20
    30
    10
    0

    红黑树:

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<vector>
      7 #include<map>
      8 #include<set>
      9 using std::cin;
     10 using std::cout;
     11 using std::endl;
     12 using std::find;
     13 using std::set;
     14 using std::map;
     15 using std::pair;
     16 using std::vector;
     17 using std::multiset;
     18 using std::multimap;
     19 #define all(c) (c).begin(), (c).end()
     20 #define iter(c) decltype((c).begin())
     21 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
     22 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
     23 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
     24 #define pb(e) push_back(e)
     25 #define mp(a, b) make_pair(a, b)
     26 const int Max_N = 200010;
     27 typedef unsigned long long ull;
     28 struct Node {
     29     int data, s, client;
     30     bool color;
     31     Node *fa, *ch[2];
     32     inline void setc(int _v, int c, int i, bool _color, Node *ptr) {
     33         data = _v, color = _color, s = i, client = c;
     34         fa = ch[0] = ch[1] = ptr;
     35     }
     36     inline void push_up() {
     37         s = ch[0]->s + ch[1]->s + 1;
     38     }
     39     inline void push_down() {
     40         for (Node *x = this; x->s; x = x->fa) x->s--;
     41     }
     42 };
     43 struct RedBlackTree {
     44     int top;
     45     Node *root, *null;
     46     Node stack[Max_N], *tail, *pool[Max_N];
     47     inline void init() {
     48         top = 0;
     49         tail = &stack[0];
     50         null = tail++;
     51         null->setc(0, 0, 0, 0, NULL);
     52         root = null;
     53     }
     54     inline Node *newNode(int v, int client) {
     55         Node *x = !top ? tail++ : pool[--top];
     56         x->setc(v, client, 1, 1, null);
     57         return x;
     58     }
     59     inline void rotate(Node* &x, bool d) {
     60         Node *y = x->ch[!d];
     61         x->ch[!d] = y->ch[d];
     62         if (y->ch[d] != null) y->ch[d]->fa = x;
     63         y->fa = x->fa;
     64         if (x->fa == null) root = y;
     65         else x->fa->ch[x->fa->ch[0] != x] = y;
     66         y->ch[d] = x;
     67         x->fa = y;
     68         y->s = x->s;
     69         x->push_up();
     70     }
     71     inline void insert(int v, int client)  {
     72         Node *x = root, *y = null;
     73         while (x->s) {
     74             x->s++;
     75             y = x, x = x->ch[v > x->data];
     76         }
     77         x = newNode(v, client);
     78         if (y != null) y->ch[v > y->data] = x;
     79         else root = x;
     80         x->fa = y;
     81         insert_fix(x);
     82     }
     83     inline void insert_fix(Node* &x) {
     84         while (x->fa->color) {
     85             Node *par = x->fa, *Gp = par->fa;
     86             bool d = par == Gp->ch[0];
     87             Node *uncle = Gp->ch[d];
     88             if (uncle->color) {
     89                 par->color = uncle->color = 0;
     90                 Gp->color = 1;
     91                 x = Gp;
     92             } else if (x == par->ch[d]) {
     93                 rotate(x = par, !d);
     94             } else {
     95                 Gp->color = 1;
     96                 par->color = 0;
     97                 rotate(Gp, d);
     98             }
     99         }
    100         root->color = 0;
    101     }
    102     inline Node *find(Node *x, int data) {
    103         while (x->s && x->data != data) x = x->ch[x->data < data];
    104         return x;
    105     }
    106     inline void erase_fix(Node* &x) {
    107         while (x != root && !x->color) {
    108             bool d = x == x->fa->ch[0];
    109             Node *par = x->fa, *sibling = par->ch[d];
    110             if (sibling->color) {
    111                 sibling->color = 0;
    112                 par->color = 1;
    113                 rotate(x->fa, !d);
    114                 sibling = par->ch[d];
    115             } else if (!sibling->ch[0]->color && !sibling->ch[1]->color) {
    116                 sibling->color = 1, x = par;
    117             } else {
    118                 if (!sibling->ch[d]->color) {
    119                     sibling->ch[!d]->color = 0;
    120                     sibling->color = 1;
    121                     rotate(sibling, d);
    122                     sibling = par->ch[d];
    123                 }
    124                 sibling->color = par->color;
    125                 sibling->ch[d]->color = par->color = 0;
    126                 rotate(par, !d);
    127                 break;
    128             }
    129         }
    130         x->color = 0;
    131     }
    132     inline void erase(int data) {
    133         Node *z = find(root, data);
    134         if (!z->s) return;
    135         Node *y = z, *x = null;
    136         if (z->ch[0]->s && z->ch[1]->s) {
    137             y = z->ch[1];
    138             while (y->ch[0]->s) y = y->ch[0];
    139         }
    140         x = y->ch[!y->ch[0]->s];
    141         x->fa = y->fa;
    142         if (!y->fa->s) root = x;
    143         else y->fa->ch[y->fa->ch[1] == y] = x;
    144         if (z != y) z->data = y->data, z->client = y->client;
    145         y->fa->push_down();
    146         if (!y->color) erase_fix(x);
    147         pool[top++] = y;
    148     }
    149     inline Node *kth(int k) {
    150         int t = 0;
    151         Node *x = root;
    152         for (; x->s;){
    153             t = x->ch[0]->s;
    154             if (k == t + 1) break;
    155             else if (k <= t) x = x->ch[0];
    156             else k -= t + 1, x = x->ch[1];
    157         }
    158         return x;
    159     }
    160     inline Node *operator[](int k) {
    161         return kth(k);
    162     }
    163     inline void go(int n) {
    164         int a, b;
    165         Node *ret = null;
    166         if (2 == n || 3 == n) {
    167             if (2 == n && root->s) ret = rbt[root->s];
    168             else if (3 == n && root->s) ret = rbt[1];
    169             if (!ret->s) printf("0
    ");
    170             else printf("%d
    ", ret->client), erase(ret->data);
    171         } else {
    172             scanf("%d %d", &a, &b);
    173             insert(b, a);
    174         }
    175     }
    176 }rbt;
    177 int main(){
    178 #ifdef LOCAL
    179     freopen("in.txt", "r", stdin);
    180     freopen("out.txt", "w+", stdout);
    181 #endif
    182     int n;
    183     rbt.init();
    184     while (~scanf("%d", &n) && n) {
    185         rbt.go(n);
    186     }
    187     return 0;
    188 }
    View Code

    sb树:

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<vector>
      7 #include<map>
      8 #include<set>
      9 using std::cin;
     10 using std::cout;
     11 using std::endl;
     12 using std::find;
     13 using std::set;
     14 using std::map;
     15 using std::pair;
     16 using std::vector;
     17 using std::multiset;
     18 using std::multimap;
     19 #define all(c) (c).begin(), (c).end()
     20 #define iter(c) decltype((c).begin())
     21 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
     22 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
     23 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
     24 #define pb(e) push_back(e)
     25 #define mp(a, b) make_pair(a, b)
     26 const int Max_N = 200010;
     27 typedef unsigned long long ull;
     28 struct Node {
     29     int v, p, s;
     30     Node *ch[2];
     31     inline void setc(int _v, int _p, int _s, Node *ptr) {
     32         v = _v, s = _s, p = _p;
     33         ch[0] = ch[1] = ptr;
     34     }
     35     inline void push_up() {
     36         s = ch[0]->s + ch[1]->s + 1;
     37     }
     38     inline int cmp(int x) const {
     39         return p == x ? -1 : x > p;
     40     }
     41 };
     42 struct SBT {
     43     int top;
     44     Node *null, *root, *tail;
     45     Node stack[Max_N], *pool[Max_N];
     46     inline void init() {
     47         top = 0;
     48         tail = &stack[0];
     49         null = tail++;
     50         null->setc(0, 0, 0, NULL);
     51         root = null;
     52     }
     53     inline Node *newNode(int v, int p) {
     54         Node *x = !top ? tail++ : pool[--top];
     55         x->setc(v, p, 1, null);
     56         return x;
     57     }
     58     inline void rotate(Node *&x, int d) {
     59         Node *k = x->ch[!d]; x->ch[!d] = k->ch[d], k->ch[d] = x;
     60         k->s = x->s;
     61         x->push_up();
     62         x = k;
     63     }
     64     inline void Maintain(Node *&x, int d) {
     65         if (!x->s) return;
     66         if (x->ch[d]->ch[d]->s > x->ch[!d]->s) rotate(x, !d);
     67         else if (x->ch[d]->ch[!d]->s > x->ch[!d]->s) rotate(x->ch[d], d), rotate(x, !d);
     68         else return;
     69         Maintain(x, 0), Maintain(x, 1);
     70     }
     71     inline void insert(Node *&x, int v, int p) {
     72         if (!x->s) { x = newNode(v, p); return; }
     73         x->s++;
     74         int d = x->cmp(p);
     75         insert(x->ch[d], v, p);
     76         x->push_up();
     77         Maintain(x, d);
     78     }
     79     inline void erase(Node *&x, int p) {
     80         if (!x->s) return;
     81         x->s--;
     82         int d = x->cmp(p);
     83         if (-1 == d) {
     84             if (!x->ch[0]->s || !x->ch[1]->s) {
     85                 pool[top++] = x;
     86                 x = x->ch[0]->s ? x->ch[0] : x->ch[1];
     87             } else {
     88                 Node *ret = x->ch[1];
     89                 for (; ret->ch[0]->s; ret = ret->ch[0]);
     90                 x->v = ret->v, x->p = ret->p;
     91                 erase(x->ch[1], x->p);
     92             }
     93         } else {
     94             erase(x->ch[d], p);
     95         }
     96     }
     97     inline Node *kth(int k){
     98         int t = 0;
     99         Node *x = root;
    100         for (; x->s;){
    101             t = x->ch[0]->s;
    102             if (k == t + 1) break;
    103             else if (k <= t) x = x->ch[0];
    104             else k -= t + 1, x = x->ch[1];
    105         }
    106         return x;
    107     }
    108     inline Node *operator[](int k) {
    109         return kth(k);
    110     }
    111     inline void go(int n) {
    112         int a, b;
    113         Node *ret = null;
    114         if (2 == n || 3 == n) {
    115             if (2 == n && root->s) ret = sbt[root->s];
    116             else if (3 == n && root->s) ret = sbt[1];
    117             if (!ret->s) printf("0
    ");
    118             else printf("%d
    ", ret->v), erase(root, ret->p);
    119         } else {
    120             scanf("%d %d", &a, &b);
    121             insert(root, a, b);
    122         }
    123     }
    124 }sbt;
    125 int main() {
    126 #ifdef LOCAL
    127     freopen("in.txt", "r", stdin);
    128     freopen("out.txt", "w+", stdout);
    129 #endif
    130     int n;
    131     sbt.init();
    132     while (~scanf("%d", &n) && n) {
    133         sbt.go(n);
    134     }
    135     return 0;
    136 }
    View Code
    By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
  • 相关阅读:
    [九度][何海涛] 顺时针打印矩阵
    [何海涛] 求二元查找树的镜像
    [九度][何海涛] 二叉树中和为某一值的路径
    [面试] 水杯题实现
    [九度][何海涛] 最小的K个数
    [九度][何海涛] 字符串的排序
    如何扩展Orchard
    IoC容器Autofac(3) 理解Autofac原理,我实现的部分Autofac功能(附源码)
    使用PrivateObject帮助单元测试
    Nuget如何自动下载依赖DLL引用
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4569572.html
Copyright © 2011-2022 走看看