基于线段树的动态区间覆盖维护,利用垂直几何分割线扫掠,完美解构矩形面积并问题
扫描线算法(Sweep-Line Algorithm)是计算几何中的经典策略,常用于求解重叠矩形面积并(Union of Rectangles)等空间覆盖问题。
对于画布上若干可能相互重叠的矩形,我们很难直接根据加减公式扣除重叠部分的面积:
tree[1].len 实时返回当前被覆盖的总有效高度。struct SegTree {
int l, r;
int cnt; // 该区间被完整覆盖的次数
double len; // 该区间内被覆盖的有效高度
} tree[MAXN << 3];
// 扫描线事件结构体
struct Event {
double x;
double y1, y2;
int k; // +1 入边,-1 出边
bool operator<(const Event& t) const {
return x < t.x;
}
} events[MAXN << 1];
// 线段树核心高度推导更新
void pushup(int u) {
if (tree[u].cnt > 0) {
// 若被完整覆盖过,有效长度直接为当前区间的离散高度差
tree[u].len = y[tree[u].r + 1] - y[tree[u].l];
} else {
// 若无覆盖,由左右子节点高度和拼装
tree[u].len = tree[u << 1].len + tree[u << 1 | 1].len;
}
}