扫描线(一)——求矩形面积并

本文介绍了使用扫描线算法解决矩形面积并问题的方法,包括离散化、矩形存储、核心扫描线过程及线段树优化。通过线段树维护,将时间复杂度降低到O(nlogn),并提供了相关例题【HDU1542】Atlantis的链接。

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

前言

扫描线应该是一个很有用的算法。

它有许多用途,比较经典的应该就是用来求矩形面积并


什么是矩形面积并

或许你会问,什么是矩形面积并?

在一个平面上,有若干个矩形,它们覆盖的总面积就是矩形面积并(重叠部分只算一次)。

要求矩形面积并,我们就可以用扫描线。


离散化

首先,我们要将这张图离散化预处理一下。

离散化的过程应该比较简单,将每个节点的坐标全部存在一个数组中,排序+去重之后,就形成了一个离散化之后的数组,把它们加入一个 m a p map map中即可(或直接二分)。

代码如下:

for(i=1;i<=n;++i) cin>>x1>>y1>>x2>>y2,xy[(i<<2)-3]=x1,xy[(i<<2)-2]=y1,xy[(i<<2)-1]=y2,xy[i<<2]=x2;//将每一个点的坐标全部存在一个数组中
sort(xy+1,xy+(n<<2)+1);//排序
for(i=1;i<=n<<2;++i)//枚举每一个值 
	if(!p[xy[i]]) f[p[xy[i]]=++cnt]=xy[i];//p存储离散化后的值,f存储原来的值,需去重

如何存储一个矩形

接下来,我们要考虑如何存储一个读入的矩形。

不难发现,其实我们只需要记录每个矩形的左右两条边即可,其中一条标记为正,一条标记为负,表示开始与结束。

代码如下:

struct Square//一个结构体
{
   
    int flag,nx,ny1,ny2;//flag记录这条边的类型(1或-1,分别表示开始与结束),nx,ny1,ny2分别存储x,y1,y2离散化后的值
    double x,y1,y2;//x记录这条边x轴上的坐标,y1,y2分别记录这条边在y轴上的起点与终点
}a[2*N+5];

for(i=1;i<=n;++i) cin>>x1>>y1>>x2>>y2,a[(i<<1)-1]=(Square){
   1,0,0,0,x1,y1,y2},a[i<<1]=(Square){
   -1,0,0,0,x2,y1,y2};//读入并存储每一个矩形

//离散化的过程(见上)

for(i=1;i<=n<<1;++i)//将每条边的坐标更新为离散化后的坐标
	a[i].nx=p[a[i].x],a[i].ny1=p[a[i].y1],a[i].ny2=p[a[i].y2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值