bzoj4998 星球聯盟

2021-08-15 15:40:53 字數 2377 閱讀 2700

description

在遙遠的s星系中一共有n個星球,編號為1…n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成

聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能

夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這兩個星球,即兩個星球間存在兩條沒有

公共隧道的路徑。為了壯大聯盟的隊伍,這些星球將建設p條新的太空隧道。這p條新隧道將按順序依次建成。一條

新軌道建成後,可能會使一些星球屬於同乙個聯盟。你的任務是計算出,在一條新隧道建設完畢後,判斷這條新軌

道連線的兩個星球是否屬於同乙個聯盟,如果屬於同乙個聯盟就計算出這個聯盟中有多少個星球。

input

第1行三個整數n,m和p,分別表示總星球數,初始時太空隧道的數目和即將建設的軌道數目。

第2至第m+1行,每行兩個整數,表示初始時的每條太空隧道連線的兩個星球編號。

第m+2行至第m+p+1行,每行兩個整數,表示新建的太空隧道連線的兩個星球編號。

這些太空隧道按照輸入的順序依次建成。

1≤n,m,p≤200000

output

輸出共p行。

如果這條新的太空隧道連線的兩個星球屬於同乙個聯盟,就輸出乙個整數,表示這兩個星球所在聯盟的星球數。

如果這條新的太空隧道連線的兩個星球不屬於同乙個聯盟,就輸出」no」(不含引號)。

sample input

5 3 4

1 2

4 3

4 5

2 3

1 3

4 5

2 4

sample output

no 3

2 5

hint

相當於每次加邊 如果形成了聯通塊 則輸出連通塊的塊的個數是多少 連通塊的意思是說邊雙聯通分量的意思

因為只有加邊操作可以考慮用並查集維護

fa1 存連通性 fa2存是否屬於同乙個點 那麼我每次加邊的時候首先判斷下當前這兩個點是否在同乙個連通塊內 如果在 直接返回答案即可 如果不在則判斷下這兩個是否已經連通 沒有連通的話就用lct link一下 如果已經連通了 那麼說明經過我這次操作可以讓我變成邊雙 那麼每當這時我就取dfs一下統計答案即可 同時把並查集 的fa2都指向我當前這個集合的頭即可 注意因為我要刪點 所以在做任何操作的時候我都需要用並查集 找到我這個集合的頭 然後往上跳才可以

具體地,對於每個加邊操作,如果它們不在同乙個邊雙里且未連通,則把它們所在邊雙連上。否則如果它們不在同乙個邊雙里且已經連通,則需要提取它們之間的路徑,把路徑上的點所在邊雙全部改為新的邊雙並在lct中「刪除」這些點。這個過程可以直接對splay tree進行dfs實現,並使用並查集來維護。

#include

#include

#define n 220000

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while(ch<='9'&&ch>='0') x=x

*10+ch-'0',ch=gc();

return

x*f;

}//fa1 存連通性 fa2存是否屬於同乙個點

int fa[n],fa1[n],fa2[n],rev[n],c[n][2],n,m,v[n],p,top,q[n];

inline int find1(int

x)inline int find2(int

x)inline void pushdown(int

x)inline bool isroot(int

x)inline void rotate(int

x)inline void splay(int

x)rotate(x);

}}inline void access(int

x)inline void makeroot(int

x)inline void link(int

x,int

y)inline void dfs(int

x,int f)

inline int add(int

x,int

y) makeroot(x);access(y);splay(y);dfs(c[y][0],y);return v[y];

}int main()

//for (int i=1;i<=n;++i) printf("%d

%d\n",fa1[i],fa2[i]);

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

return

0;}

BZOJ 4998 星球聯盟

題意 給一張無向圖,並不斷加邊 u,v 並詢問 u,v 是否位於同乙個雙聯通分量裡,若位於同一雙聯通分量,輸出這個雙聯通分量的 size 使用並查集 lct維護。有兩套並查集 s1是用來維護每個點歸屬哪乙個強連通分量,每個點的祖先是這個強連通分量的代表節點,同時代表節點儲存這個強連通分量的 size...

bzoj4998 星球聯盟(並查集 邊雙)

傳送門 總算有自己的 bzoj 賬號啦!話說這題好像 scape 去年暑假就講過 然而我到現在才會 lct 什麼的跑得太慢了而且我也不會,所以這裡是乙個並查集的做法 首先題目意思就是要我們動態維護點雙 我們離線,先求出乙個森林,並且要使用編號盡量小的邊 連上一條邊的時候,如果它們還沒有聯通,那麼顯然...

bzoj4998 LCT 並查集 星球聯盟

description 在遙遠的s星系中一共有n個星球,編號為1 n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成 聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能 夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這...