洛谷 P1196 NOI2002 銀河英雄傳說

2022-06-01 09:09:06 字數 474 閱讀 6836

有30000列,每列都有一艘戰艦,編號1~30000

有2種操作:

1.將一列的戰艦運到另一列

2.詢問兩個戰艦是否在同一列,如果是,求出它們之間的距離

並查集,

維護每個點x離自己祖先的距離dis[x],和該點所在集合的大小size[x]

每次查詢時更新即可,

點x,y之間距離為abs(dis[x] - dis[y]) - 1

#include using namespace std;

int t, x, y, xx, yy;

int fa[31000], dis[31000], size[31000];

char c;

int abs(int x)

int gf(int x)

int main()

while (t--)

else

}}

P1196 NOI2002 銀河英雄傳說

題目 p1196 noi2002 銀河英雄傳說 分析 對於m指令,一次移動整列,並且是把兩列合併成一列。對於c指令 判斷飛船 i 和飛船 j 是否在同一列,若在,則輸出它們中間隔了多少艘飛船。由於需要判斷是否在同一列,每列初始都只有一艘飛船,之後需要不斷合併,所以很容易就想到要用並查集來實現。ac ...

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為以這個點為根...