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:那一行的行号
};
代码如下: