• hdu2795 Billboard


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

    线段树,单点更新

    好题,查询属于全区间的单点查询,目标值:准备贴的海报宽度

    如果左子树的最大值比目标值大,则优先查且只查左子树(我们想要得到编号最小且满足条件的行贴海报)

    否则查右子树,如果左右子树的最大值,都比目标值小,就返回-1(没地方贴了~)

    WA了一次,没考虑高度为1的展板。

     1 #include <stdio.h>
     2 
     3 #define lson l, m, root<<1
     4 #define rson m+1, r, root<<1|1
     5 
     6 const int maxn = 200010;
     7 int max1[maxn<<2];
     8 
     9 int max(int x, int y)
    10 {
    11     return x>y? x: y;
    12 }
    13 
    14 void push_up(int root)
    15 {
    16     max1[root] = max(max1[root<<1], max1[root<<1|1]);
    17 }
    18 
    19 void build(int x, int l, int r, int root)
    20 {
    21     int m;
    22     if(l == r)
    23     {
    24         max1[root] = x;
    25         return;
    26     }
    27     m = (l + r) >> 1;
    28     build(x, lson);
    29     build(x, rson);
    30     push_up(root);
    31 }
    32 
    33 void update(int x, int sub, int l, int r, int root)
    34 {
    35     int m;
    36     if(l == r)
    37     {
    38         max1[root] -= sub;
    39         return;
    40     }
    41     m = (l + r) >> 1;
    42     if(x <= m)
    43     {
    44         update(x, sub, lson);
    45     }
    46     if(m+1 <= x)
    47     {
    48         update(x, sub, rson);
    49     }
    50     push_up(root);
    51 }
    52 
    53 int query(int x, int l, int r, int root)
    54 {
    55     int m;
    56     if(l == r)
    57     {
    58         if(max1[root] >= x)
    59         {
    60             return l;
    61         }
    62         return -1;
    63     }
    64     m = (l + r) >> 1;
    65     if(max1[root<<1] >= x)
    66     {
    67         return query(x, lson);
    68     }
    69     if(max1[root<<1|1] >= x)
    70     {
    71         return query(x, rson);
    72     }
    73     return -1;
    74 }
    75 
    76 int main()
    77 {
    78     int n, w, h, a, temp;
    79     while(~scanf("%d%d%d", &h, &w, &n))
    80     {
    81         if(n < h)
    82         {
    83             h = n;
    84         }
    85         build(w, 1, h, 1);
    86         while(n-- && scanf("%d", &a))
    87         {
    88             temp = query(a, 1, h, 1);
    89             printf("%d\n", temp);
    90             if(~temp)
    91             {
    92                 update(temp, a, 1, h, 1);
    93             }
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    【转】京东抢购服务高并发实践
    【转】聊聊高并发系统之队列术
    深入研究Clang(八) Clang代码阅读之打log读流程1
    【转】保证分布式系统数据一致性的6种方案
    TextureView实现视频播放
    Spring之FactoryBean
    支付宝系统架构
    【转】高并发系统之限流特技
    Go语言中new和make的区别
    Linux下安装Beego:go install: cannot install cross-compiled binaries when GOBIN is set
  • 原文地址:https://www.cnblogs.com/yuan1991/p/hdu2795.html
Copyright © 2020-2023  润新知