扫描线相关

本文介绍了扫描线算法解决平面内矩形面积、周长等并或重合问题,通过离散化和线段树进行计算。首先解释了扫描线思想,通过将矩形边转换为权值边,利用线段树维护区间信息。然后通过两个例题,分别是窗口的星星和矩形周长,详细阐述了算法的实现过程和关键点,包括边的排序和线段树的更新维护。
摘要由CSDN通过智能技术生成

前置知识:

1.离散化

2.线段树

解决的问题:

平面内多个矩形面积、周长并或重合面积等问题。

本文先采用洛谷模板题为例

算法思想:

首先来看这张图(以模板题样例为例)

扫描线的核心思想,其实就是用一根竖直(或水平)的线水平(或纵向)扫过整个图。为什么可以这样做呢?结合这张图,我们不难发现,若用一根竖直的线水平扫过图形,有图形覆盖的线的长度只会在标红的线(即纵向线)处产生变化。又因为,两条像这样标红的纵线之间的部分均可以看成矩形,所以我们可以用纵线将整个图形分成若干个小矩形,逐个计算相加。

在实现的过程中,因为坐标之间的距离可能很大,所以我们要先进行离散化,并进行去重,再进行计算。

那么有一个重要的问题待解决:如何计算变化的线长?有一个巧妙的做法是:将矩形的左边记为一条权值为1的边,将矩形的右边记为权值为-1的边。维护一个数组 c[ i ],表示在 i 这个区间里有多少个矩形覆盖。扫描线每到达一条新的边,便把这条边的权值加到 c[ i ] 的对应位置上。当要计算线长时,只要看c数组中有几个数不为1就好了。

这时,我们发现 c 数组的操作涉及区间修改和区间查询,所以我们可以将它与线段树联系到一起,在 c 上建立线段树。

上图中,1、2、3、4为y坐标离散后的值,线1-线2之间的部分为c[1],以此类推。黑色的纵边为正权,红色的为负权。

代码:

#include<bits/stdc+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值