問題:動態圖連通性查詢,支持加邊、刪邊、查詢兩點連通。離線算法:時間軸分治 + 並查集可撤銷(或線段樹分治)。
由於原文內容較少,這裡補充標準離線並查集框架:
struct DSU {
vector fa, sz;
vector> history; // 記錄 (被合併根, 原size)
int find(int x) { return fa[x]==x?x:find(fa[x]); } // 不壓縮路徑!
bool unite(int x, int y) {
x=find(x); y=find(y); if (x==y) { history.emplace_back(-1,-1); return false; }
if (sz[x]>sz[y]) swap(x,y);
history.emplace_back(x, sz[y]);
fa[x]=y; sz[y]+=sz[x]; return true;
}
void rollback() {
auto [x, sy] = history.back(); history.pop_back();
if (x==-1) return;
int y = fa[x];
fa[x]=x; sz[y]=sy;
}
};
時間複雜度 O((Q+M) log Q),空間 O(Q+M)。適合動態連通性離線查詢。