• 【POJ】3481 Double Queue


     1 #include<cstdio>
     2 #define MAXN 100010
     3 struct SplayTree {
     4     int size, root;
     5     int next[MAXN][2], pre[MAXN], key[MAXN], pos[MAXN];
     6     void Init() {
     7         size = root = 0;
     8         next[0][0] = next[0][1] = 0;
     9     }
    10     void NewNode(int &rt, int father, int val, int id) {
    11         rt = ++size;
    12         next[rt][0] = next[rt][1] = 0;
    13         pre[rt] = father;
    14         key[rt] = val;
    15         pos[rt] = id;
    16     }
    17     void Rotate(int x, int kind) {
    18         int y = pre[x];
    19         next[y][!kind] = next[x][kind];
    20         pre[next[x][kind]] = y;
    21         pre[x] = pre[y];
    22         if (pre[y])
    23             next[pre[y]][next[pre[y]][1] == y] = x;
    24         next[x][kind] = y;
    25         pre[y] = x;
    26     }
    27     void Splay(int x, int goal) {
    28         while (pre[x] != goal) {
    29             if (next[pre[x]][0] == x)
    30                 Rotate(x, 1);
    31             else
    32                 Rotate(x, 0);
    33         }
    34         if (!goal)
    35             root = x;
    36     }
    37     void Insert(int val, int id) {
    38         int x;
    39         for (x = root; next[x][key[x] < val]; x = next[x][key[x] < val])
    40             ;
    41         NewNode(next[x][key[x] < val], x, val, id);
    42         Splay(next[x][key[x] < val], 0);
    43     }
    44     void Delete(int x) {
    45         if (x == root) {
    46             if (!next[x][0] && !next[x][1])
    47                 Init();
    48             else {
    49                 int t = next[x][0] ? 0 : 1;
    50                 pre[next[x][t]] = 0;
    51                 root = next[x][t];
    52             }
    53         } else {
    54             int y, t;
    55             y = pre[x];
    56             t = (next[y][1] == x);
    57             next[y][t] = next[x][!t];
    58             pre[next[x][!t]] = y;
    59             Splay(y, 0);
    60         }
    61     }
    62     void Lowest() {
    63         int x = root;
    64         if (x) {
    65             for (; next[x][0]; x = next[x][0])
    66                 ;
    67             printf("%d\n", pos[x]);
    68             Delete(x);
    69         } else
    70             puts("0");
    71     }
    72     void Highest() {
    73         int x = root;
    74         if (x) {
    75             for (; next[x][1]; x = next[x][1])
    76                 ;
    77             printf("%d\n", pos[x]);
    78             Delete(x);
    79         } else
    80             puts("0");
    81     }
    82 } tree;
    83 int main() {
    84     int cmd, val, id;
    85     tree.Init();
    86     while (scanf("%d", &cmd), cmd) {
    87         if (cmd == 1) {
    88             scanf("%d%d", &id, &val);
    89             tree.Insert(val, id);
    90         } else if (cmd == 2)
    91             tree.Highest();
    92         else
    93             tree.Lowest();
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    服务级后门自己做——创建服务
    使用Win32创建串口通讯程序
    LoadImage with resource 出现未定义
    direct path write等待事件
    enq: TX row lock/index contention、allocate ITL等待事件
    enq: TT contention等待事件
    enq: TM contention等待事件
    enq: RO fast object reuse等待事件
    direct path write temp等待事件
    enq: US contention等待事件
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2634194.html
Copyright © 2020-2023  润新知