題目:
題意:有好多好多艦隊排成一排。
m i,j表示將編號i艦隊所在的列排到編號j艦隊所在列的後面。
c i,j表示查詢編號i艦隊和編號j艦隊如果在一列,中間間隔了多少只艦,如果不在同一列輸出-1
思路:
很自然能想到用乙個陣列可以表示某乙個艦排在這一列的第幾個
當要查詢的時候只需要用並查集查一下隊首相不相同,然後把他們在隊伍中的編號減一下就行。
因為要知道排在第幾個,合併的時候因為是放在隊尾,所以合併的時候就需要知道前面這個隊伍原來的大小
所以還需要乙個陣列來維護隊伍的大小。
剩下來就交給並查集來操作。
路徑壓縮的時候要把父親的排名也加到自己身上。然後所在隊伍的大小也要更新。
1 #include2 #include3 #include4 #include5 #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的過程...