JSOI 2008 星球大戰

2021-08-22 16:21:46 字數 1734 閱讀 6426

題目傳送門星球大戰

題目描述:

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

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

輸入格式:

輸入檔案第一行包含兩個整數,n(1 ≤ n ≤ 2m)和 m(1 ≤ m ≤ 200000),分別表示星球的數目和以太隧道的數目。星球用 0~n-1的整數編號。

接下來的 m 行,每行包括兩個整數 x,y,其中 x,y ∈ [ 0 , n ) 且 x ≠ y ,表示星球 x 和星球 y 之間有以太隧道。注意所有的以太隧道都是雙向的。

之後輸入乙個整數 k(k ≤ n),表示帝國計畫打擊的星球個數。

接下來 k 行,每行乙個星球編號 di(0 ≤ di < n),表示打擊的星球編號順序。

輸出格式:

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

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

樣例資料:輸入

8 13

0 11 6

6 55 0

0 61 2

2 33 4

4 57 1

7 27 6

3 6516357

輸出

111233

備註:【資料範圍】

對於 20% 的資料,m ≤ 10;

對於另 20% 的資料,n ≤ 10000;

對於 100% 的資料,m ≤ 200000。

先考慮暴力做法,即按照順序刪除每個點,然後每次用並查集來處理剩下的點組成的連通塊,複雜度o(

實際上,我們可以換一種角度來考慮,用「加點」來代替「刪點」,就是先將不被打擊的點的連通情況處理出來,然後從後往前乙個乙個的加點,再考慮加進來的這個點對之前的連通塊的影響,複雜度o(

emmm,還是挺簡單的吧

#include#include#include#include#define n 500005

using namespace std;

int n,m,k,t;

int a[n],ans[n],father[n];

int first[n],u[n],v[n],next[n];

bool attack[n];

void add(int x,int y)

int find(int x)

void merge(int x,int y)

void read()

}} }

ans[0]=num;

for(i=0;i<=k;++i)

printf("%d\n",ans[i]);

}int main()

jsoi2008 星球大戰

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

JSOI2008 星球大戰

題意簡述 給出n個點的無向圖,每次刪去乙個點,詢問當前的連通塊個數。刪點太難做,不如加點,首先將詢問讀取,然後離線倒著處理。標記每個已經刪去的點,首先計算出所有沒標記的點一共組成多少個連通塊。然後依次加點,同時刪去標記,首先將連通塊個數增加1,而當前點每與其他的連通塊相連,連通塊個數減少1,最終算出...

jsoi2008星球大戰bzoj1015

很簡單的一題,但是資料範圍看錯了和讀題時沒看到是0到n 1搞得wa了一次tle了一次真是弱啊喵,就是簡單的一道離線然後並查集加點就可以了喵 include include include include define ll long long define n 400005 define m 400...