description
在遙遠的s星系中一共有n個星球,編號為1…n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成input聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能
夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這兩個星球,即兩個星球間存在兩條沒有
公共隧道的路徑。為了壯大聯盟的隊伍,這些星球將建設p條新的太空隧道。這p條新隧道將按順序依次建成。一條
新軌道建成後,可能會使一些星球屬於同乙個聯盟。你的任務是計算出,在一條新隧道建設完畢後,判斷這條新軌
道連線的兩個星球是否屬於同乙個聯盟,如果屬於同乙個聯盟就計算出這個聯盟中有多少個星球。
第1行三個整數n,m和p,分別表示總星球數,初始時太空隧道的數目和即將建設的軌道數目。output第2至第m+1行,每行兩個整數,表示初始時的每條太空隧道連線的兩個星球編號。
第m+2行至第m+p+1行,每行兩個整數,表示新建的太空隧道連線的兩個星球編號。 這些太空隧道按照輸入的順序依次建成。
1≤n,m,p≤200000
輸出共p行。 如果這條新的太空隧道連線的兩個星球屬於同乙個聯盟,就輸出乙個整數,表示這兩個星球所在聯盟的星球數。sample input如果這條新的太空隧道連線的兩個星球不屬於同乙個聯盟,就輸出」no」(不含引號)。
5 3 4sample output1 24 3
4 52 3
1 34 5
2 4
nohint
題解
感覺還是很好想的啊..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...