扫描线技巧 (Scanning Line)
扫描线(Scanning Line)是计算几何中处理区域覆盖与面积统计的核心方法。它利用“降维”思想,通过一根扫描线在平面上平移,将二维问题离散化为一维区间动态更新问题。
1. 核心模型:矩形面积并 (Area Union)
1.1 拓扑分解与 Fubini 定理证明
2. 离散化与线段树一致性 (Segment Tree Consistency)
在扫描线算法中,线段树维护的是 轴方向的覆盖区间。
3. 教材级核心代码实现 (C++)
4. 经典教材级例题与练习 (Exercises)
例题 1:矩形周长并 (Perimeter Union) - 连通性分析
题目描述:求 个矩形并集的轮廓总周长。 推导:
- 垂直边贡献:相邻两次扫描线覆盖长度的变化量 。
- 水平边贡献:。
线段树需额外维护
num_seg(覆盖段数)及l_cov,r_cov(左右端点是否覆盖)。
Check Solution
练习 1:窗口最大权值 - 扫描线变体
题目描述:用 的窗口覆盖带权点,求最大权值和。 思路:
- 将每个点 扩大为矩形 。
- 窗口覆盖点等价于矩形包含点。寻找平面内被矩形覆盖层数(权值和)最多的点。
- 线段树维护区间加和区间最大值。
Check Solution
提示:将点 转化为垂直线段事件:在 处区间 加 ,在 处减 。线段树全局最大值即为答案。
练习 2:矩形面积交 (Area Intersection)
题目描述:求 个矩形重叠至少 次的区域面积。
思路:线段树维护覆盖次数。pushup 时,若 cnt >= K,长度为全长;若 cnt < K,则从子节点汇总满足条件的长度。
🎯 模块导航
- 计算几何基础 - 原语与精度控制。
- 凸包算法 (Convex Hull) - 几何结构构建。
- 数据结构:线段树 - 扫描线的基础设施。