R×C 矩陣有 N 台舊機器(矩形區域),新機器 1×M,問有多少種放置位置不與舊機器重疊。M=1 時橫豎各算一次需除 2。
x ∈ [x1, x2] 且 y ∈ [y1-M+1, y2](邊界裁剪)。未覆蓋長度 × Δx 得總可放置面積。struct Segment { int l, r, h, v; }; // 掃描線段:列區間[l,r), 掃描行h, 增量v
struct Node { int l, r, h, v; }; // 線段樹節點:區間[l,r], 覆蓋計數h, 未覆蓋長度v
void pushup(int u) {
if (node[u].h) node[u].v = bset[node[u].r+1] - bset[node[u].l];
else if (node[u].l == node[u].r) node[u].v = 0;
else node[u].v = node[lson].v + node[rson].v;
}
本題是「矩形面積並」經典變體:通過離散化掃描線+線段樹維護覆蓋狀態,將二維問題降維為一維區間加減,完美解決大規模矩形覆蓋統計。