前置知识:
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+