很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入格式:
輸入檔案第一行包含兩個整數,n (1 <= n <= 2m) 和m (1 <= m <= 200,000),分別表示星球的數目和以太隧道的數目。星球用0~n-1的整數編號。
接下來的m行,每行包括兩個整數x, y,其中(0<=x<>y接下來一行是乙個整數k,表示帝國計畫打擊的星球個數。
接下來的k行每行乙個整數x,滿足0<=x輸出檔案的第一行是開始時星球的連通塊個數。
接下來的k行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。
輸入樣例#1:
8 130 11 6
6 55 0
0 61 2
2 33 4
4 57 1
7 27 6
3 6516
357
輸出樣例#1:
111233
[jsoi2008]
並查集。逆序做,因為並查集是不能修改的。
1 #include23const
int n = 500100;4
struct
edgee[n];
7int
far[n],head[n],t[n],ans[n];
8bool
v[n];
9int
n,m,k,cnt,p,s;
1011
int find(int
a)12
16void add(int x,int
y)17
23int
main()
2433 scanf("
%d",&k);
34for(int i=1;i<=k;++i)
3539 s = n-k;
40for(int i=0;i//
找出不會被轟炸的點並連起來
4150
}51 ans[k+1] =s;
52for(int i=k;i>=1;--i)
5366
}67 ans[i] =s;68}
69for(int i=1;i<=k+1;++i)
70 printf("
%d\n
",ans[i]);
71return0;
72 }
P1197 JSOI2008 星球大戰
思路和關閉農場差不多,不過加了一些時間上的優化。當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個聯通塊中,那麼就將其合併,連通塊個數減一。注 並查集的題果斷找祖宗。include include include include define n 4...
P1197 JSOI2008 星球大戰
題目 p1197 jsoi2008 星球大戰 分析 看完題目,第一眼就是想到,我們反過來不斷把新的邊加入,然後利用陣列儲存答案,最後逆序輸出。num 陣列用來給破壞的星球編號 從大到小 為什麼要編號呢?因為後面 sort 排序是根據這個編號來的。預處理時,我們以兩個星球中 x,y 最大值作為該邊的編...
P1197 JSOI2008 星球大戰
思路和關閉農場差不多,不過加了一些時間上的優化。當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個聯通塊中,那麼就將其合併,連通塊個數減一。注 並查集的題果斷找祖宗。include include include include define n 4...