bzoj1015 星球大戰starwar

2021-07-10 13:11:39 字數 1542 閱讀 3055

很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。 但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。

輸入檔案第一行包含兩個整數,n (1  < =  n  < =  2m) 和m (1  < =  m  < =  200,000),分別表示星球的數目和以太隧道的數目。星球用 0 ~ n-1的整數編號。接下來的m行,每行包括兩個整數x, y,其中(0 < = x <> y 表示星球x和星球y之間有「以太」隧道,可以直接通訊。接下來的一行為乙個整數k,表示將遭受攻擊的星球的數目。接下來的k行,每行有乙個整數,按照順序列出了帝**的攻擊目標。這k個數互不相同,且都在0到n-1的範圍內。

輸出檔案的第一行是開始時星球的連通塊個數。接下來的n行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。

8 13

0 11 6

6 55 0

0 61 2

2 33 4

4 57 1

7 27 6

3 6516

3571

1123

3先吐個槽,這題面,我也是醉了。。

這題怎麼做呢?

首先判斷連通的第一思路當然是並查集了!

但是,這道題樸素並查集並不能做,怎麼辦呢?

我們發現可以離線!可以離線!

於是我們把操作離線,然後把刪邊變成加點,這題就能做了。(貌似很水的樣子)

#include #include #include using namespace std;

int tot,n,m,d,father[400001],head[400001],q[400001],ans[400001],cnt=1;

bool used[400001],des[400001];

struct datae[400001];

int find(int x)

void ins(int u,int v)

void add(int x)

} i = e[i].next;

} }int main()

scanf("%d",&d);

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

for(int i = 0; i < n; i ++)

if(!des[i])

ans[d+1] = tot;

for(int i = d; i > 0; i --)

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

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

return 0;

}

jsoi2008星球大戰bzoj1015

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

BZOJ 1015 JSOI2008 星球大戰

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

jsoi2008 星球大戰

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