P1197 星球大戰

2021-08-19 20:25:35 字數 1715 閱讀 9478

很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。

某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。

但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。

現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。

輸入格式:

輸入檔案第一行包含兩個整數, nn

( 1 < = n < = 2m

1<=n

<=2

m ) 和 m

m ( 1 < = m < = 200,000

1<=m

<=2

00,0

00),分別表示星球的數目和以太隧道的數目。星球用 0

0 ~ n-1n−

1 的整數編號。

接下來的 m

m 行,每行包括兩個整數 x

x , y

y ,其中( 0 < = x <> y

0<=x

<

>

y 表示星球 x

x 和星球 y

y 之間有 「以太」 隧道,可以直接通訊。

接下來的一行為乙個整數 k

k ,表示將遭受攻擊的星球的數目。

接下來的 k

k 行,每行有乙個整數,按照順序列出了帝**的攻擊目標。這 k

k 個數互不相同,且都在 0

0 到 n-1n−

1 的範圍內。

輸出格式:

第一行是開始時星球的連通塊個數。接下來的k

行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。

輸入:8 13

0 11 6

6 55 0

0 61 2

2 33 4

4 57 1

7 27 6

3 6516

35輸出:111

233思路:並查集,+逆序做

將摧毀,變成收復,從後往前檢查

code:

#includeusing namespace std;

const int maxn=400002;

struct point

a[maxn];

int f[maxn]; //並查集

int last[maxn];//鍊錶

int h[maxn];//破環的星球

int ans[maxn];//每次打擊後的結果

bool e[maxn];//判斷是否被打擊

int tot;

int find(int x)

inline void add(int x,int y)//鄰鍊錶儲存資料

int main()

int k;

cin>>k;

int cnt=n-k;//表示破壞完之後還有多少個星球

for(int i=1;i<=k;++i)

for(int i=0;i=1;--i)//從後往前」恢復「

}ans[i]=cnt;//記錄當前的聯通塊

}for(int i=1;i<=k;++i)

cout<

洛谷 P1197星球大戰

很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...

P1197 星球大戰 並查集 離線處理

題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...

洛谷P1197 星球大戰 並查集

給出一張圖,每次刪除乙個點 以及連線它的邊 求每次刪除後的連通塊個數。時間倒流應該是很顯然的吧。由於並查集的刪除操作並不好搞,所以可以考慮反過來,把 刪除 變成 建造 首先用vec torv ecto r記錄每乙個點連線的邊。不需要用領接表,因為每條邊只需訪問1次。用que uequ eue會mle...