浅谈扫描线
前置知识
离散化,线段树
扫描线
首先假设你有\(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是离散化函数

浙公网安备 33010602011771号