搞了幾次才過。。。太弱了。。。
本題的關鍵想到擴充套件並查集,在基礎並查集的基礎上額外維護乙個集合的大小和當前點在集合中的位置就可以了。
code:
typenode=record fa,d,l:longint;end;
var f:array [0..30001] of node;
m,a,b,i:longint;
ch:char;
function find(x:longint):longint;
vari,j,p,q:longint;
begin
i:=x;
while f[i].fa<>i do i:=f[i].fa;
p:=i;i:=x;
while i<>p do
begin
q:=f[i].fa;
f[i].fa:=p;
j:=q;
repeat
inc(f[i].d,f[j].d);
j:=f[j].fa
until f[j].fa=j;
i:=q;
end;
find:=p;
end;
procedure union(a,b:longint);
begin
a:=find(a);
b:=find(b);
f[a].fa:=b;
f[a].d:=f[b].l;
inc(f[b].l,f[a].l)
end;
begin
readln(m);
for i:=1 to 30000 do
begin
f[i].fa:=i;
f[i].l:=1;
end;
for i:=1 to m do
begin
readln(ch,a,b);
if ch='m' then union(a,b)
else
if (find(a)=find(b))
then writeln(abs(f[a].d-f[b].d)-1)
else writeln(-1);
end;
end.
NOI2002 銀河英雄傳說
noi2002 day1 t1 公元5801年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織...
NOI 2002 銀河英雄傳說
有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...
NOI2002 銀河英雄傳說
公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵...