[JSOI2008]星球大戰starwar

來源:互聯網
上載者:User

標籤:scanf   led   href   bsp   geo   ref   pre   它的   順序   

1015: [JSOI2008]星球大戰starwarTime Limit: 3 Sec  Memory Limit: 162 MB Submit: 6516  Solved: 3024 [Submit][Status][Discuss]Description

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

Input

  輸入檔案第一行包含兩個整數,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的範 圍內。

Output

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

Sample Input8 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
7Sample Output1
1
1
2
3
3 時光倒流,用並查集維護聯通塊個數即可 
#include <cstdio>const int maxn = 400000 + 10, maxm = 200000 + 10;int n, m, k;struct Edge{    int to, next;    Edge(){}    Edge(int _t, int _n): to(_t), next(_n){}}e[maxm << 1];int fir[maxn] = {0}, cnt = 0;inline void ins(int u, int v){    e[++cnt] = Edge(v, fir[u]); fir[u] = cnt;    e[++cnt] = Edge(u, fir[v]); fir[v] = cnt;}int fuck[maxn], fff[maxn];bool state[maxn] = {false};int fa[maxn];int Find(int x){    return x == fa[x] ? x : fa[x] = Find(fa[x]);}int main(){    scanf("%d %d", &n, &m);    for(int u, v, i = 1; i <= m; i++){        scanf("%d %d", &u, &v);        ins(u, v);    }    int k;    scanf("%d", &k);    for(int i = 1; i <= k; i++){        scanf("%d", fuck + i);        state[fuck[i]] = true;    }    for(int i = 0; i < n; i++) fa[i] = i;    for(int u = 0; u < n; u++){        if(state[u]) continue;        for(int v, i = fir[u]; i; i = e[i].next){            v = e[i].to;            if(state[v]) continue;            fa[Find(u)] = Find(v);        }    }    int ans = 0;    for(int i = 0; i < n; i++)        if(!state[i] && Find(i) == i) ans++;    for(int i = k; i; i--){        fff[i] = ans;        state[fuck[i]] = false;        ans++;        for(int v, j = fir[fuck[i]]; j; j = e[j].next){            v = e[j].to;            if(state[v]) continue;            if(Find(v) != Find(fuck[i])){                ans--;                fa[Find(v)] = Find(fuck[i]);            }        }    }    printf("%d\n", ans);    for(int i = 1; i <= k; i++)        printf("%d\n", fff[i]);    return 0;}

 

[JSOI2008]星球大戰starwar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.