【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,要自己做