bzoj4998 LCT 並查集 星球聯盟

2021-08-28 03:34:09 字數 1944 閱讀 6450

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 24 3

4 52 3

1 34 5

2 4

sample output

no

hint

題解

感覺還是很好想的啊..

lct維護森林

每次加進來的邊要不就是樹邊要不就是非樹邊

樹邊直接加上,並查集維護連通性直接lct太慢啦啦啦

非樹邊就會成環,設這條邊是(x,y)

把x~y的路徑提取出來,就是這個環

再用乙個並查集維護點屬於的邊雙編號

暴力dfs維護並查集

別人的lct模板怎麼這麼好看啊

不管了以後我的模板就是這個

#include

#include

#include

#include

#include

using namespace std;

int fa1[210000],fa2[210000],siz[210000];

int findfa1(int

x)int findfa2(int

x)struct lct

tr[210000];

bool isroot(int

x)void pushdown(intx)}

void update(int

x)void rotate(int

x)void splay(int

x) rotate(x);

}}void access(intx)}

void markroot(int

x)void link(int

x,int

y)int sum;

void play(int

x,int

y)void lk(int

x,int

y) else

}int n,m,p;

int main()

while(p--)

return

0;}

4998 星球聯盟 LCT 並查集

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

bzoj 2959 長跑(LCT 並查集)

time limit 10 sec memory limit 256 mb submit 315 solved 178 submit status discuss 某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長...

BZOJ2959 長跑(lct 並查集)

傳送門 用lct維護一顆動態樹。如果連了某一條邊形成了乙個環,證明一次長跑這個環上的所有的點都可以被統計,所以可以將這個環縮成乙個點。用ufs來實現。那麼一次長跑實際上就是在一條樹鏈上跑,只有乙個方向,在lct上維護乙個sum就可以了。時間複雜度是均攤的,因為每乙個點至多被縮點一次,所以o k ml...