給定 n 個矩形(邊平行於座標軸),求它們覆蓋的總面積(重疊區域僅計算一次)。
經典「矩形面積並」解法:
ys[]。x = x1, y ∈ [y1, y2), type = +1(進入)x = x2, y ∈ [y1, y2), type = -1(離開)cover 與覆蓋長度 len。更新區間時:
cover > 0 → 完全覆蓋,len = ys[r+1] - ys[l]cover == 0 且非葉子 → len = left.len + right.lencover == 0 → len = 0離散座標 ys[] 大小為 m,線段樹維護 m-1 個基本區間 [ys[i], ys[i+1])。更新區間 [y1, y2) 對應線段樹區間 [L, R-1],其中 L = lower_bound(ys, y1), R = lower_bound(ys, y2)。
struct SegNode {
int cover; // 覆蓋計數
double len; // 覆蓋長度
} tree[MAXN << 2];
void pushUp(int o, int l, int r) {
if (tree[o].cover > 0) {
tree[o].len = ys[r+1] - ys[l]; // 完全覆蓋
} else if (l == r) {
tree[o].len = 0; // 葉子無覆蓋
} else {
tree[o].len = tree[o<<1].len + tree[o<<1|1].len; // 合併子節點
}
}
double,輸出格式控制精度。掃描線 + 線段樹是矩形面積並、周長並、重疊矩形計數等幾何問題的通用框架。關鍵在於正確離散化、區間映射與線段樹覆蓋長度維護邏輯。HDU 1542 是該模板的經典應用題。