洛谷P1196 銀河英雄傳說

2022-06-26 03:15:14 字數 1060 閱讀 6931

題目

題意:有好多好多艦隊排成一排。

m i,j表示將編號i艦隊所在的列排到編號j艦隊所在列的後面。

c i,j表示查詢編號i艦隊和編號j艦隊如果在一列,中間間隔了多少只艦,如果不在同一列輸出-1

思路

很自然能想到用乙個陣列可以表示某乙個艦排在這一列的第幾個

當要查詢的時候只需要用並查集查一下隊首相不相同,然後把他們在隊伍中的編號減一下就行。

因為要知道排在第幾個,合併的時候因為是放在隊尾,所以合併的時候就需要知道前面這個隊伍原來的大小

所以還需要乙個陣列來維護隊伍的大小。

剩下來就交給並查集來操作。

路徑壓縮的時候要把父親的排名也加到自己身上。然後所在隊伍的大小也要更新。

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10 #include11 #include12

13#define inf 0x7fffffff

14using

namespace

std;

15 typedef long

long

ll;16 typedef pairpr;

1718

intt;

19const

int maxn = 3e4 + 5;20

intpar[maxn], rnk[maxn], num[maxn];

2122

int ffind(int

x)23

3132

void

init()

3339}40

41void uunion(int x, int

y)42

4950

intmain()

5163

else

68else72}

73}74return0;

75 }

洛谷P1196 銀河英雄傳說

大意 你有30000個佇列,第i個佇列中只有i 有t個操作,1,把某個佇列頭接到另乙個佇列尾。2,問兩個元素之間的距離。本題主要有三種解法。帶權並查集。具體來說就是,並查集維護當前集合的大小,這個點距離代表元 隊首 的邊數。然後把合併和路徑壓縮魔改一下。詢問的時候就直接取距離之差。1 include...

洛谷 P1196 銀河英雄傳說

p1196 銀河英雄傳說 加權並查集,簡介見加權並查集,具體方法見 及注釋 p1196 銀河英雄傳說 includeint fa 30010 int r 30010 r i 表示第i號戰艦在其父親之後的第r i 個位置 int r2 30010 r2 i 表示以第i號戰艦為隊首的佇列有r2 i 輛戰...

洛谷P1196 銀河英雄傳說

題目大意 有30000個船,第i個船在第i列,兩個操作,m 把第i列的船整體拼到第j列船後,c 求第i和第j個船之間的船的個數 題解 可以想到用並查集,在基礎的並查集上增加路徑,用num陣列存第i個船到隊首的距離,用len存這一列的船的個數。問題主要在路徑壓縮上維護num陣列上。可以在find的過程...