hdu2795_Billboard

来源:互联网 发布:软件冒烟测试 用例 编辑:程序博客网 时间:2024/06/03 10:23

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

 

这道题,如果能想通的话,是道简单的线段树,想不通就是被虐死的份。。。。。

 

好吧,我就是被虐死了。。。。

 

最后还是去看了小hh神牛的代码,可惜还是弄不懂为什么代码要那样写,所以去网上搜了一下这道题的题解,看了别人的思路,突然间大悟!

 

思路:

因为每个announcement的高都是1,所以把一整块board 90度旋转,h为宽,w为高,线段树的叶子就是原来board的每一行。

 

注意一点,一开始看到board的长和宽有10^9这么多,还以为要离散化,其实是不用的,因为announcement贴上去以后不会被覆盖,所以最多就是有200,000张长度为10^9的announcement,即线段树最多只有200,000个叶子,所以建树的时候要在h和n之间取最小值。

 

树节点维护一个记录区间内最大空位长度的域,对于每个announcement,先通过query来判断可否贴上去,如果可以则update。

 

struct SegTree
{
    int left, right;
    int idx, value;  //value:在[left, right]这段区间内有最多空位的那一行的空位长度,idx:那一行的行号

};

 

 

代码如下:

 

原创粉丝点击