『线段树扫描线算法』简单理解

本文介绍了如何使用线段树和扫描线算法解决矩形面积合并问题。首先对矩形的纵坐标离散化,通过四元组表示矩形边界的正负影响,并按横坐标排序。然后利用线段树维护区间覆盖情况,优化从O(n^2)到O(n log n)的时间复杂度。此外,还讨论了如何应用类似方法解决求矩形覆盖点数量的问题,同样保持O(n log n)的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Question1

给定若干个矩形,线矩形的面积并。分别用O(n2)O(n^2)O(n2)级别和O(n log n)O(n\ log\ n)O(n log n)级别的算法解决。

我们的做法是对矩形的纵坐标进行离散化,得到离散化后的坐标y1,y2,...,ym.y_1,y_2,...,y_m.y1,y2,...,ym.val(y)val(y)val(y)表示原始坐标值。这样我们就可以将浮点数转化为了方便处理的整数,有利于数组下表的表示。

我们用数组c[i](i∈[1,m))c[i](i∈[1,m))c[i](i[1,m))存储在当前情况下,yi+1−yiy_{i+1}-y_{i}yi+1yi的纵区间的覆盖情况。000表示没有覆盖,kkk表示被覆盖了kkk次,不可能出现小于000的情况,因为只有“被覆盖的次数”和“没有覆盖”两种情况的存在。

现在我们回到这个面积计算的题中:我们可以将一个矩形的左右边界分别处理,左边界带来的是“正影响”,会对答案做出纵区间大小的贡献;右边界带来的是“负影响”,会使先前的正影响消失。这也是上面c数组都是非负数的原因。因此我们可以将左右边界分开,用四元组表示(横坐标,上边界,下边界,影响);用(xi,y1,i,y2,i,fi)(x_i,y_{1,i},y_{2,i},f_i)(xi,y1,i,y2,i,fi)表示。这里的影响指“正影响”和“负影响”,分别规定为1和-1.

得到若干个四元组以后,我们需要对xxx坐标进行排序,那么我们得到了一个xxx坐标递增的“竖线”。枚举每一个四元组,若当前的影响为正,则令c[k](k∈[y1,i,y2,i))c[k](k∈[y_{1,i},y_{2,i}))c[k](k[y1,i,y2,i))加上1,表示这个纵区间产生了影响;反之,则减去111来消除这一个影响。

现在我们需要统计答案,当i>1i>1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值