• HDU 5200 Trees 二分


    题目链接:

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

    bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=574&pid=1003

    题解:

    把输入按照高度排序,离线处理出所有高度的答案,每次查询的时候二分查找(upper_bound)。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 const int maxn = 50101;
     8 const int mod = 1e9 + 7;
     9 typedef long long LL;
    10 
    11 struct Node {
    12     int id, h;
    13     bool operator < (const Node& rhm) const {
    14         return h<rhm.h;
    15     }
    16 }nds[maxn];
    17 
    18 int n, q;
    19 int ans[maxn];
    20 bool cuted[maxn];
    21 // int fa[maxn];
    22 
    23 void init() {
    24     // for(int i=0;i<maxn;i++) fa[i]=i;
    25     memset(cuted, 0, sizeof(cuted));
    26     cuted[0] = cuted[n + 1] = 1;
    27 }
    28 
    29 int solve(int x) {
    30     //超出去的部分要先处理掉
    31     if (x<nds[0].h) return 1;
    32     if (x >= nds[n - 1].h) return 0;
    33     int low = 0, hig = n;
    34     while (low + 1<hig) {
    35         int mid = low + (hig - low) / 2;
    36         if (nds[mid].h <= x) low = mid;
    37         else hig = mid;
    38     }
    39     return ans[low];
    40 }
    41 
    42 int main() {
    43     while (scanf("%d%d", &n, &q) == 2 && n) {
    44         init();
    45         for (int i = 0; i<n; i++) {
    46             scanf("%d", &nds[i].h);
    47             nds[i].id = i + 1;
    48         }
    49         sort(nds, nds + n);
    50         int num = 1;
    51         for (int i = 0; i<n; i++) {
    52             int id = nds[i].id;
    53             if (!cuted[id - 1] && !cuted[id + 1]) {
    54                 num++;
    55             }
    56             else if (cuted[id - 1] && cuted[id + 1]) {
    57                 num--;
    58             }
    59             cuted[id] = 1;
    60             ans[i] = num;
    61         }
    62         while (q--) {
    63             int x;
    64             scanf("%d", &x);
    65             printf("%d
    ", solve(x));
    66         }
    67     }
    68     return 0;
    69 }
    70 /*
    71 1 100
    72 1
    73 0
    74 2
    75 */

    直接用upper_bound():

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 const int maxn = 50101;
     8 const int mod = 1e9 + 7;
     9 typedef long long LL;
    10 
    11 struct Node {
    12     int id, h;
    13     Node(int id, int h) :id(id), h(h) {}
    14     Node() {}
    15     bool operator < (const Node& rhm) const {
    16         return h<rhm.h;
    17     }
    18 }nds[maxn];
    19 
    20 int n, q;
    21 int ans[maxn];
    22 bool cuted[maxn];
    23 // int fa[maxn];
    24 
    25 void init() {
    26     // for(int i=0;i<maxn;i++) fa[i]=i;
    27     memset(cuted, 0, sizeof(cuted));
    28     cuted[0] = cuted[n + 1] = 1;
    29 }
    30 
    31 int solve(int x) {
    32     //超出去的部分要先处理掉
    33     if (x<nds[0].h) return 1;
    34     if (x >= nds[n - 1].h) return 0;
    35     //upper_bound找到的是x后面的一个数,所以要减一
    36     return ans[upper_bound(nds, nds + n, Node(0,x))-nds-1];
    37 }
    38 
    39 int main() {
    40     while (scanf("%d%d", &n, &q) == 2 && n) {
    41         init();
    42         for (int i = 0; i<n; i++) {
    43             scanf("%d", &nds[i].h);
    44             nds[i].id = i + 1;
    45         }
    46         sort(nds, nds + n);
    47         int num = 1;
    48         for (int i = 0; i<n; i++) {
    49             int id = nds[i].id;
    50             if (!cuted[id - 1] && !cuted[id + 1]) {
    51                 num++;
    52             }
    53             else if (cuted[id - 1] && cuted[id + 1]) {
    54                 num--;
    55             }
    56             cuted[id] = 1;
    57             ans[i] = num;
    58         }
    59         while (q--) {
    60             int x;
    61             scanf("%d", &x);
    62             printf("%d
    ", solve(x));
    63         }
    64     }
    65     return 0;
    66 }
    67 /*
    68 1 100
    69 1
    70 0
    71 2
    72 */
  • 相关阅读:
    什么是看板方法?
    瓶颈法则
    累积流图——你还没有用过吗?
    为什么我们关注看板方法?
    蒟蒻报道
    博客更换通知
    浅谈树套树(线段树套平衡树)&学习笔记
    浅谈FFT(快速博立叶变换)&学习笔记
    题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】
    题解 洛谷P4550/BZOJ1426 【收集邮票】
  • 原文地址:https://www.cnblogs.com/fenice/p/5410652.html
Copyright © 2020-2023  润新知