題目描述
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入輸出格式
輸入格式:
輸入檔案第一行包含兩個整數,n (1 <= n <= 2m) 和m (1 <= m <= 200,000),分別表示星球的數目和以太隧道的數目。星球用0~n-1的整數編號。
接下來的m行,每行包括兩個整數x, y,其中(0<=x < > y < n),表示星球x和星球y之間有以太隧道。注意所有的以太隧道都是雙向的。
接下來一行是乙個整數k,表示帝國計畫打擊的星球個數。
接下來的k行每行乙個整數x,滿足0<=x < n,表示帝國計畫打擊的星球編號。帝國總是按輸入的順序依次摧毀星球的。
輸出格式:
輸出檔案的第一行是開始時星球的連通塊個數。
接下來的k行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。
輸入輸出樣例
輸入樣例#1:
8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5 1
6 3 5 7
輸出樣例#1:
1 1
1 2 3 3
說明[jsoi2008]
【分析】
並查集不能拆,只能連,這就尷尬了
所以倒著來就好啦。。
不瞞你說,每次我看到自己的**都有著由內而外的敬意
//星球大戰
#include
#include
#include
#include
#define fo(i,j,k) for(i=j;i<=k;i++)
using
namespace
std;
vector
x[400001];
int n,m,k,s,ans[400001],father[400001],a[200001],b[200001],h[400001];
bool e[400001];
int find(int q)
int main()
scanf("%d",&k);
s=n-k; //全部打掉後所剩集合數
fo(i,1,k)
fo(i,1,m)
if(!e[a[i]]&&!e[b[i]]) //兩個星球都沒被打擊過?合併!
}int p=s;
for(i=k;i>=1;i--)}}
s++;
ans[i]=s;
}fo(i,1,k) printf("%d\n",ans[i]);
printf("%d",p);
return
0;}
洛谷P1197 JSOI2008 星球大戰
思路 首先動態求割點會tle,考慮倒序離線操作。當所有打擊完成後,tarjin統計同一連通分量上的點,並查集維護連通性 實際上來說只要兩點之間有邊則將之合併即可tarjin處理麻煩反而會mle?不清楚為什麼 再依次將被毀滅的星球復原,則對答案的影響只與當前星球連線的星球數量 及連通關係 有關,每次統...
洛谷P1197 JSOI2008 星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...
洛谷 P1197 JSOI2008 星球大戰
題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...