zoukankan      html  css  js  c++  java
  • 【HDOJ】4585 Shaolin

    Set可解,Treap也可解。
    (1) Treap

      1 /*  */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <stack>
      8 #include <vector>
      9 #include <deque>
     10 #include <algorithm>
     11 #include <cstdio>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <cstring>
     15 #include <climits>
     16 #include <cctype>
     17 #include <cassert>
     18 #include <functional>
     19 #include <iterator>
     20 #include <iomanip>
     21 using namespace std;
     22 //#pragma comment(linker,"/STACK:102400000,1024000")
     23 
     24 #define sti                set<int>
     25 #define stpii            set<pair<int, int> >
     26 #define mpii            map<int,int>
     27 #define vi                vector<int>
     28 #define pii                pair<int,int>
     29 #define vpii            vector<pair<int,int> >
     30 #define rep(i, a, n)     for (int i=a;i<n;++i)
     31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     32 #define clr                clear
     33 #define pb                 push_back
     34 #define mp                 make_pair
     35 #define fir                first
     36 #define sec                second
     37 #define all(x)             (x).begin(),(x).end()
     38 #define SZ(x)             ((int)(x).size())
     39 #define lson            l, mid, rt<<1
     40 #define rson            mid+1, r, rt<<1|1
     41 
     42 typedef struct Node {
     43     Node* ch[2];
     44     int r, v, s, id;
     45 
     46     Node() {}
     47 
     48     Node(int v_, int id_) {
     49         ch[0] = ch[1] = NULL;
     50         r = rand();
     51         v = v_;
     52         id = id_;
     53         s = 1;
     54     }
     55 
     56     int cmp(int v_) const {
     57         if (v == v_)    return -1;
     58         return v<v_ ? 0:1;
     59     }
     60 
     61     friend bool operator< (const Node& a, const Node& b) {
     62         return a.r < b.r;
     63     }
     64 
     65     void maintain() {
     66         s = 1;
     67         if (ch[0] != NULL)    s += ch[0]->s;
     68         if (ch[1] != NULL)    s += ch[1]->s;
     69     }
     70 
     71 } Node;
     72 
     73 const int maxn = 1e5+5;
     74 const int maxm = 5e6+5;
     75 int id[maxm];
     76 Node* root;
     77 
     78 void rotate(Node*& o, int d) {
     79     Node* k = o->ch[d^1];
     80     o->ch[d^1] = k->ch[d];
     81     k->ch[d] = o;
     82     o->maintain();
     83     k->maintain();
     84     o = k;
     85 }
     86 
     87 void insert(Node*& o, int x, int id) {
     88     if (o == NULL) {
     89         o = new Node(x, id);
     90     } else {
     91         int d = x<o->v ? 0:1;
     92         insert(o->ch[d], x, id);
     93         if (o->ch[d]->r > o->r)
     94             rotate(o, d^1);
     95     }
     96     o->maintain();
     97 }
     98 
     99 void remove(Node*& o, int x) {
    100     int d = o->cmp(x);
    101 
    102     if (d == -1) {
    103         Node* u = o;
    104         if (o->ch[0]!=NULL && o->ch[1]!=NULL) {
    105             int d2 = o->ch[0]->r > o->ch[1]->r ? 1:0;
    106             rotate(o, d2);
    107             remove(o->ch[d2], x);
    108         } else {
    109             if (o->ch[0] == NULL)
    110                 o = o->ch[1];
    111             else
    112                 o = o->ch[0];
    113             delete u;
    114         }
    115     } else {
    116         remove(o->ch[d], x);
    117     }
    118 
    119     if (o != NULL)
    120         o->maintain();
    121 }
    122 
    123 void del(Node*& o) {
    124     if (o->ch[0] != NULL)    del(o->ch[0]);
    125     if (o->ch[1] != NULL)    del(o->ch[1]);
    126     delete o;
    127     o = NULL;
    128 }
    129 
    130 int findK(Node* o, int x) {
    131     if (o == NULL)
    132         return -1;
    133 
    134     int d = o->cmp(x);
    135     if (d == -1)
    136         return (o->ch[0]==NULL ? 0:o->ch[0]->s) + 1;
    137     if (d == 1) {
    138         return findK(o->ch[0], x);
    139     } else {
    140         int tmp = findK(o->ch[1], x);
    141         if (tmp < 0)
    142             return -1;
    143         tmp += (o->ch[0]==NULL ? 0:o->ch[0]->s) + 1;
    144         return tmp;
    145     }
    146 }
    147 
    148 Node* kth(Node* o, int k) {
    149     if (o==NULL || k<=0 || k>o->s)
    150         return NULL;
    151 
    152     int s = o->ch[0]==NULL ? 0:o->ch[0]->s;
    153     if (k == s+1)
    154         return o;
    155     else if (k <= s)
    156         return kth(o->ch[0], k);
    157     else
    158         return kth(o->ch[1], k-s-1);
    159 }
    160 
    161 int main() {
    162     ios::sync_with_stdio(false);
    163     #ifndef ONLINE_JUDGE
    164         freopen("data.in", "r", stdin);
    165         freopen("data.out", "w", stdout);
    166     #endif
    167 
    168     int n, m;
    169     int x, g, k;
    170     int ans;
    171     Node *gtp, *ltp;
    172 
    173     while (scanf("%d", &n)!=EOF && n) {
    174         insert(root, 1e9, 1);
    175         rep(i, 0, n) {
    176             scanf("%d %d", &x, &g);
    177             insert(root, g, x);
    178             m = findK(root, g);
    179             ltp = kth(root, m-1);
    180             gtp = kth(root, m+1);
    181             if (ltp != NULL) {
    182                 if (gtp->v - g < g - ltp->v) {
    183                     ans = gtp->id;
    184                 } else {
    185                     ans = ltp->id;
    186                 }
    187             } else {
    188                 ans = gtp->id;
    189             }
    190             printf("%d %d
    ", x, ans);
    191         }
    192         del(root);
    193     }
    194 
    195     #ifndef ONLINE_JUDGE
    196         printf("time = %d.
    ", (int)clock());
    197     #endif
    198 
    199     return 0;
    200 }

    (2)set

     1 /* 4585 */
     2 #include <iostream>
     3 #include <string>
     4 #include <map>
     5 #include <queue>
     6 #include <set>
     7 #include <stack>
     8 #include <vector>
     9 #include <deque>
    10 #include <algorithm>
    11 #include <cstdio>
    12 #include <cmath>
    13 #include <ctime>
    14 #include <cstring>
    15 #include <climits>
    16 #include <cctype>
    17 #include <cassert>
    18 #include <functional>
    19 #include <iterator>
    20 #include <iomanip>
    21 using namespace std;
    22 //#pragma comment(linker,"/STACK:102400000,1024000")
    23 
    24 #define sti                set<int>
    25 #define stpii            set<pair<int, int> >
    26 #define mpii            map<int,int>
    27 #define vi                vector<int>
    28 #define pii                pair<int,int>
    29 #define vpii            vector<pair<int,int> >
    30 #define rep(i, a, n)     for (int i=a;i<n;++i)
    31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
    32 #define clr                clear
    33 #define pb                 push_back
    34 #define mp                 make_pair
    35 #define fir                first
    36 #define sec                second
    37 #define all(x)             (x).begin(),(x).end()
    38 #define SZ(x)             ((int)(x).size())
    39 #define lson            l, mid, rt<<1
    40 #define rson            mid+1, r, rt<<1|1
    41 
    42 const int maxn = 5e6+5;
    43 int id[maxn];
    44 
    45 int main() {
    46     ios::sync_with_stdio(false);
    47     #ifndef ONLINE_JUDGE
    48         freopen("data.in", "r", stdin);
    49         freopen("data.out", "w", stdout);
    50     #endif
    51     
    52     sti st;
    53     sti::iterator iter;
    54     int n;
    55     int k, g, tmp;
    56     
    57     while (scanf("%d", &n)!=EOF && n) {
    58         st.clr();
    59         rep(i, 0, n) {
    60             scanf("%d %d", &k, &g);
    61             iter = st.lower_bound(g);
    62             if (iter == st.end()) {
    63                 if (iter == st.begin()) {
    64                     printf("%d 1
    ", k);
    65                 } else {
    66                     --iter;
    67                     printf("%d %d
    ", k, id[*iter]);
    68                 }
    69             } else {
    70                 if (iter == st.begin()) {
    71                     printf("%d %d
    ", k, id[*iter]);
    72                 } else {
    73                     tmp = *iter;
    74                     --iter;
    75                     if (tmp-g < g-*iter) {
    76                         printf("%d %d
    ", k, id[tmp]);
    77                     } else {
    78                         printf("%d %d
    ", k, id[*iter]);
    79                     }
    80                 }
    81             }
    82             id[g] = k;
    83             st.insert(g);
    84         }
    85     }
    86     
    87     #ifndef ONLINE_JUDGE
    88         printf("time = %d.
    ", (int)clock());
    89     #endif
    90     
    91     return 0;
    92 }



  • 相关阅读:
    五大Java开源论坛
    mysql limit,offset 区别
    查询某个字段存在于哪几个表
    C++分享笔记:5X5单词字谜游戏设计
    Linux分享笔记:系统状态检测命令小结
    Linux分享笔记:查看帮助命令 & 常用系统工作命令
    数据结构(C语言)分享笔记:数据结构的逻辑层次、存储层次
    Linux分享笔记:shell终端的介绍
    Java开发学生管理系统
    JAVA使用JDBC连接,修改MySQL数据库(比较乱)
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4895333.html
Copyright © 2011-2022 走看看