浅谈扫描线

前置知识

离散化,线段树

扫描线

首先假设你有\(n\)个矩形。如果直接暴力求解这些矩形的覆盖面积肯定不行,这时就要用扫描线算法。
假设有一根线,从下往上扫描:

把每个小矩形分成很多不同的块,高是扫过的距离,那个位置没有被覆盖高就是 \(0\)。显然答案就是高 \(×\) 宽的和。
每次线碰到矩形底边,其在\(x\)轴对应的位置(也就是投影)全部加 \(1\),相反,碰到底边则全部减 \(1\)
那么那一个线段树维护就好了,数据大需要离散化。
那么模板题的核心代码就是这个了:

点击查看代码
add(f(b[0].x1),f(b[0].x2),1);
for(int i=1;i<2*n;i++){
	int x1 = f(b[i].x1) , x2 = f(b[i].x2);
	sum += (b[i].y - b[i-1].y) * w[0];
	add(x1,x2,b[i].o);
}
//add是区间加,b是上下边(x1,x2相当于l,r,若为底边则o=1否则o=-1),f是离散化函数
(很简单对吧,快去把模板题切了)
posted @ 2025-09-18 20:36  虚空远行者  阅读(10)  评论(0)    收藏  举报