扫描线乱谈
前置知识
离散化,线段树
扫描线
首先假设你有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是离散化函数
(很简单对吧,快去把模板题切了)