題目描述
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入輸出格式
輸入格式:
輸入檔案第一行包含兩個整數,n (1 <= n <= 2m) 和m (1 <= m <= 200,000),分別表示星球的數目和以太隧道的數目。星球用0~n-1的整數編號。
接下來的m行,每行包括兩個整數x, y,其中(0<=x<>y
#include
#include
#define n 440000
inline int
read()
returnx;}
struct nodedata[n];
int fa[n],h[n],n,m,x,y,k,tmp,num=0,op[n],q[n];
bool flag[n],flag1[n];
inline void insert1(int
x,int
y)inline int find(int
x)int main()
k=read();
memset(flag,true,sizeof(flag));
for (int i=1;i<=k;++i) tmp=read(),flag[++tmp]=false,op[i]=tmp;
for (int i=1;i<=n;++i) fa[i]=i;
for (int i=1;i<=n;++i) }}
memset(flag1,false,sizeof(flag1));int ans=0;
for (int i=1;i<=n;++i)
}q[k+1]=ans;
for (int i=k;i>=1;--i)
}flag[op[i]]=true;q[i]=ans;
}for (int i=1;i<=k+1;++i) printf("%d\n",q[i]);
return
0;}
JSOI 2008 星球大戰
題目傳送門星球大戰 題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝...
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...