扫描线模板
记矩形数量为 n n n,坐标值域为 V V V。
朴素的扫描线:从下往上依次扫,每次从左往右统计长度,时间复杂度 O ( V 2 ) O(V^2) O(V2)。
-
将矩形的上下边进行离散化,时间复杂度 O ( n V ) O(nV) O(nV)。
-
将矩形的横坐标离散化,分割成若干小线段,每次枚举小线段,时间复杂度 O ( n 2 ) O(n^2) O(n2)。
-
用线段树维护,节点区间 [ l , r ] [l,r] [l,r] 表示第 l l l 个点到第 r + 1 r+1 r+1 个点之间的小线段。维护覆盖次数以及覆盖长度,每次扫描到上下边时区间更新,时间复杂度 O ( n log n ) O(n \log n) O(nlogn)。
动图参考:https://oi-wiki.org/geometry/images/scanning.svg
二维数点
1. [SHOI2007] 园丁的烦恼
矩形里数点可以用二维前缀和。因此维护 ( 0 , 0 ) (0,0) (0,0) 到 ( a , b ) (a,b) (a,b) 点的数量,二维偏序问题,先按横坐标排序,然后套 BIT。注意 BIT 无法处理 0。
具体实现:将询问拆成四个点离线,点按横坐标排序,每次 BIT 加点、查询,时间复杂度 O ( ( n + m ) log V ) O((n+m) \log V) O((n+m)logV), V V V 指坐标值域 。
2. [CQOI2017] 老C的任务
在上题基础上加上离散化即可。