hdu2795_Billboard

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:那一行的行号

};

 

 

代码如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值