【TIOJ】1903-你的笑容由我來守護-EXTREME
題目:
給一張$N$個點的無向圖,一開始有$M$條邊。 接著$Q$個操作,有以下兩種:
- 增加一條連著$A_i$、$B_i$的邊。
- 刪除一條連著$A_i$、$B_i$的邊(保證這條邊存在)。
每次操作完後輸出當前連通塊數量。
- $1 \le N \le 5e5$
- $M+Q \le 5e5$
- $0 \le A_i,B_i \le N-1$
- $A_i \neq B_i$
輸入:
第一行有一個數字T代表測資筆數。
每筆測資第1行有3個整數N、M、Q。
接下來M行每行兩個整數Ai、Bi,代表Ai和Bi這兩個人目標相同。
接下來Q行,每行有一個字元 c 和兩個整數Ai、Bi,代表修改一個紀錄。
如果 c 是 N,代表增加一筆 Ai、Bi 兩人目標相同的紀錄;
如果 c 是 D,代表要刪除一筆 Ai、Bi 目標相同的紀錄,所有刪除都是合法的。
輸出:
對於每筆測資的Q筆修改,每次修改完輸出一行代表連通塊數量。
Ex 1 Input:
2
3 0 3
N 0 1
N 1 2
N 2 1
3 3 3
0 1
1 2
2 1
D 2 1
D 0 1
D 2 1
Ex 1 Output:
2
1
1
1
2
3
題解:
動態維護連通塊數量可以使用並查集(DSU),但多了刪除的操作。
其實刪除操作就只是倒著做回去,只要事先紀錄原本的父節點並啟發式合併壓複雜度即可。
而要將兩者結合,就需要拿出特殊的資料結構:時間線段樹,然後先把所有操作都讀入再一個一個做。
需要注意的地方:
- 這題用cin+IO優化輸入會卡常,必須用scanf或自己寫輸入函式
- unordered_map<pii,pii> 沒有內建hash,要自己做