线段树+离散化+线性扫描 POJ 1151 Atlantis

本文介绍了一种使用线段树结合离散化解决矩形面积计算问题的方法。通过离散化纵轴坐标,利用线段树进行矩形区域划分,实现了高效计算多个矩形重叠部分的总面积。

 这道题快把我折磨死了……

首先不会做,听大牛说这题很简单,用线段树+离散化就可以了,可是我一点思路都没有!

后来看了别人的思路,自己写了个程序算是过了,既然是经典的题,就做一下笔记吧。

要点:

1,离散化的对象:按照之前接触过的线段树,都是存的线段,我想应该可以扩展,实现举行区域的保存(二维线段树?),但是我不会做……后来参考了网上一些讨论,说可以离散化“纵轴”或者“横轴”坐标。

2,加入离散化纵轴,按照一般做法,首先应该排序并删除重复的元素,处理完放在数组my中。这些元素的个数用来作为建立线段树的区域大小。

3,建立线段树,按照2中处理后的纵坐标的范围,建立线段树。

4,线性扫描:既然离散化了纵轴,将每一个矩形的纵轴(有两个)分别插入和删除在线段树中。

对4的解释:在线段树中设置了“测度”和“覆盖数”成员,可以将整个区域划分成“以线段树某节点的测度为长”,以相邻纵轴之间的“距离”(即相应的横坐标差)位宽的许多个不重叠的小的矩形。在扫描每一个纵轴时,按照横坐标从小到达的顺序扫描(从左到右),这样每扫描一个纵轴,就可以计算一个小矩形的面积,然后累加。在整个扫描过程中,线段树的整个“测度”(tree[1].len)就是小矩形的长。要计算每一个矩形的长(即整个线段树的测度),只需要在线段树中和本矩形相关的线段(纵轴),所以,当第一次扫描到一个原始矩形的纵轴时(可以用-1表示),把它插入到线段树,用于更新当前线段树的测度。当第二次(可以用1表示)扫描到一个原始矩形的纵轴时,就必须从线段树删除(之前插入的),因为这时候这个原始矩形的面积已经被计算完毕。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值