zoukankan      html  css  js  c++  java
  • hdu 4268 Alice and Bob(STL版)

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

      这是今天网络赛的水题,下午短路了,没想到怎么做。队友hq是用treap做的,不过赛后我才想懂怎么做,回到宿舍快速打了一个,立马就一个1y了。。。。

      这题跟以前做的数星星十分相似,转化过去其实就是在指定坐标与其左下方的点匹配。我用线段树做,如果自己打数据结构,可以用treap,也可以直接利用multi_set来当treap用。这题的时限挺长的,所以用了大量的STL都没超时。

    3000ms+的代码:

    View Code
      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <map>
      5 #include <set>
      6 #include <vector>
      7 #include <algorithm>
      8 #include <queue>
      9 
     10 #define lson l, m, rt << 1
     11 #define rson m + 1, r, rt << 1 | 1
     12 
     13 using namespace std;
     14 
     15 const int maxn = 100005;
     16 typedef pair<int, int> pii;
     17 
     18 vector<int> rec_w;
     19 set<int> Wide;
     20 map<int, int> Pos;
     21 int cnt[maxn << 3];
     22 priority_queue<pii, vector<pii>, greater<pii> > Alice, Bob;
     23 
     24 void add(int k, int l, int r, int rt){
     25     if (l == r){
     26         cnt[rt]++;
     27         return ;
     28     }
     29     int m = (l + r) >> 1;
     30 
     31     if (k <= m) add(k, lson);
     32     else add(k, rson);
     33 
     34     cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
     35 }
     36 
     37 bool find(int k, int l, int r, int rt){
     38     if (l == r){
     39         cnt[rt]--;
     40         return true;
     41     }
     42     int m = (l + r) >> 1;
     43 
     44     if (k > m && cnt[rt << 1 | 1]){
     45         if (find(k, rson)){
     46             cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
     47             return true;
     48         }
     49     }
     50     if (cnt[rt << 1] && find(k, lson)){
     51         cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
     52         return true;
     53     }
     54 
     55     return false;
     56 }
     57 
     58 int deal(int n){
     59     int l, w;
     60     int ret = 0;
     61 
     62     rec_w.clear();
     63     Wide.clear();
     64     Pos.clear();
     65     while (Alice.size()) Alice.pop();
     66     while (Bob.size()) Bob.pop();
     67 
     68     for (int i = 0; i < n; i++){
     69         scanf("%d%d", &l, &w);
     70         Alice.push(make_pair(l, w));
     71         Wide.insert(w);
     72     }
     73     for (int i = 0; i < n; i++){
     74         scanf("%d%d", &l, &w);
     75         Bob.push(make_pair(l, w));
     76         Wide.insert(w);
     77     }
     78 
     79     for (set<int>::iterator ii = Wide.begin(); ii != Wide.end(); ii++){
     80         Pos[*ii] = rec_w.size();
     81         rec_w.push_back(*ii);
     82     } // hash
     83 
     84     memset(cnt, 0, (rec_w.size() << 2) * sizeof(int));
     85     while (Alice.size()){
     86         while (Bob.size() && Bob.top().first <= Alice.top().first){
     87             add(Pos[Bob.top().second], 0, rec_w.size() - 1, 1);
     88             Bob.pop();
     89         }
     90 #ifndef ONLINE_JUDGE
     91         for (int i = 0; i < (rec_w.size() << 1); i++) printf("%d : %d\n", i, cnt[i]);
     92         printf("find pos %d\n", Pos[Alice.top().second]);
     93 #endif
     94         if (find(Pos[Alice.top().second], 0, rec_w.size() - 1, 1)) ret++;
     95         Alice.pop();
     96     }
     97 
     98     return ret;
     99 }
    100 
    101 int main(){
    102     int T, n;
    103 
    104     scanf("%d", &T);
    105     while (T-- && ~scanf("%d", &n)){
    106         printf("%d\n", deal(n));
    107     }
    108 
    109     return 0;
    110 }

    ——written by Lyon

  • 相关阅读:
    PowerDesigner中如何添加约束
    C#静态构造函数总结
    PendingIntent与Intent的区别
    常用编码总结
    操作系统的版本概况
    如何制作一寸、二寸、六寸证件照片
    datagridview使用tooltip控件显示单元格内容
    OpenGL ES之Must use a native order direct Buffer解决方案
    Exception.InnerException 属性的使用
    Matrix使用的分析
  • 原文地址:https://www.cnblogs.com/LyonLys/p/hdu_4268_Lyon.html
Copyright © 2011-2022 走看看