P1196 NOI2002 銀河英雄傳說

2021-09-28 21:35:25 字數 813 閱讀 1241

題目

p1196 [noi2002]銀河英雄傳說 分析

對於m指令,一次移動整列,並且是把兩列合併成一列。

對於c指令:判斷飛船 i 和飛船 j 是否在同一列,若在,則輸出它們中間隔了多少艘飛船。

由於需要判斷是否在同一列,每列初始都只有一艘飛船,之後需要不斷合併,所以很容易就想到要用並查集來實現。

ac**

#include

#include

using

namespace std;

int f[

30001

], dis[

30001

], num[

30001];

/*f[i]:i的祖先,即飛船前乙個飛船

dis[i]:飛船與它所在列頭的距離,初始為 0

num[i]:第 i 列飛船的數量,初始為 1

*/// 初始化

void

init()

}int

find

(int x)

int fn =

find

(f[x]);

// 以後盡量這樣寫,對付帶權並查集

dis[x]

+= dis[f[x]];

// 回溯時更新

return f[x]

= fn;

}int

main()

else

else}}

return0;

}

p1196 NOI2002 銀河英雄傳說

所謂帶權並查集 本題所求的不止是兩個編號之間是否有關係,還要求兩個編號之間有什麼關係,這就要求我們維護多個陣列,fa陣列維護兩個編號之間的連通性,re維護編號為i的戰艦到fa i 之間的距離,num維護編號為i的戰艦所在的那一列有多少戰艦。include include include includ...

P1196 NOI2002 銀河英雄傳說

並查集的變式題 o 好像我並不大會表達 還是直接 吧 include include includeusing namespace std int f 30010 sum 30010 tot 30010 f為並查集陣列,sum為這個點與他修改之前的父親之間的飛船個數,包括他父親 tot為以這個點為根...

P1196 NOI2002 銀河英雄傳說

喵喵喵這道題這題跟搭積木很像,然而我居然迷失在了這令人心醉神迷的題面之中。逃 好的呢這題就是乙個比較繞的並查集,每次將乙個的頭接在要移到的地方的尾上,並每次訪問的時候用將兩個的字尾數相減即可得出答案 include include include include include include in...