离散化+线段树 POJ 2528 (Mayor's posters)

 昨天开始接触线段树,感觉是很简单的数据结构,今天我发现我错了。

今天从早上纠结到现在,一直在看线段树有关的问题,其中POJ 2401(线段树+并归排序)还没有解决。发现线段树非常灵活,要掌握好也非常难。

在参考别人的基础上,做了POJ 2528。

现在总结一下要点:

1,离散化:题目中给出的海报长度范围时1~10000000,因此不可能建立一个如此大的线段树。而观察海报数量范围1~10000,相对来小就小的多了。于是考虑离散化方法:将所有海报的坐标(起始点和终点)排序,这些点最多也就有20000个,每张海报本来使用起始/终点坐标来表示的,现在可以使用起始/终点的“rank”作为映射来表示。

例如有三张海报:p1(1,100),p2(2,8) p3(3,6)

那么将所有起始/终点排序后存放在map:1,2,3,6,8,100。(注意可能存在重复的元素)

从而p1,p2和p3可以用(map[1],map[6]),(map[2],map[5)和(map[3],map[4])表示。于是可以建立一个[1,6]的线段树。

2,参考别人的做法,线段树每个节点增加一个域:c。

c>0表示此节点(某一段)被唯一的一张海报覆盖。

c=0表示未被任何海报覆盖或者被多于一张海报覆盖。

这样在所有海报张贴完毕后,搜索可现实海报种类时,只要遇到某个节点(某一段)的c是1,那么就不需要搜索子区域。 这也是线段树“对段操作的优雅性“的体现。不需要搜索到每一个点。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值