題目描述
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治著整個星系。
某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。
現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通塊的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入格式
輸入檔案第一行包含兩個整數,n,m
n,mn,
m,分別表示星球的數目和以太隧道的數目。星球用 0∼n
−1
0 \sim n-1
0∼n−
1的整數編號。
接下來的 m
mm 行,每行包括兩個整數 x,y
x,yx,
y,表示星球 x
xx 和星球 y
yy 之間有 「以太」 隧道,可以直接通訊。
接下來的一行為乙個整數 k
kk ,表示將遭受攻擊的星球的數目。
接下來的 k
kk 行,每行有乙個整數,按照順序列出了帝**的攻擊目標。這 k
kk 個數互不相同,且都在 0
00 到 n−1
n-1n−
1 的範圍內。
輸出格式
第一行是開始時星球的連通塊個數。接下來的 k
kk 行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。
輸入輸出樣例
輸入 #1
8 13
0 11 6
6 55 0
0 61 2
2 33 4
4 57 1
7 27 6
3 6516
357輸出 #111
1233
說明/提示
【資料範圍】
對於 100
%100\%
100%
的資料,1≤m
≤2×1
05
1\le m \le 2\times 10^5
1≤m≤2×
105,1≤n
≤2
m1\le n \le 2m
1≤n≤2m
,x ≠y
x \neq y
x=y。
[jsoi2008]
題解正向摧毀星球時維護過於艱難(或許需要lct
\mathcal
lct?),不如離線反向生成星球做乙個並查集。
每次新增星球時遍歷所有與它連線且存在的星球,檢查是否在乙個連通塊內,不在則連線並使連通塊數量−1-1
−1。**
退役老鹹魚含淚複習帶路徑壓縮並查集,並因為陣列開小了錯失1a1a
1a……
#include
using
namespace std;
const
int m=
4e5+5;
int n,m,k,que[m]
,dad[m]
,ans[m]
;bool des[m]
;vector<
int>edg[m]
;voidin(
)int
root
(int v)
intadd
(int v)
voidac(
)int
main()
P1197 星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...
P1197 JSOI2008 星球大戰
思路和關閉農場差不多,不過加了一些時間上的優化。當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個聯通塊中,那麼就將其合併,連通塊個數減一。注 並查集的題果斷找祖宗。include include include include define n 4...
P1197 JSOI2008 星球大戰
題目 p1197 jsoi2008 星球大戰 分析 看完題目,第一眼就是想到,我們反過來不斷把新的邊加入,然後利用陣列儲存答案,最後逆序輸出。num 陣列用來給破壞的星球編號 從大到小 為什麼要編號呢?因為後面 sort 排序是根據這個編號來的。預處理時,我們以兩個星球中 x,y 最大值作為該邊的編...