洛谷P1196 銀河英雄傳說

2022-05-24 02:36:09 字數 667 閱讀 5676

題目大意:有30000個船,第i個船在第i列,兩個操作,m:把第i列的船整體拼到第j列船後,c:求第i和第j個船之間的船的個數

題解:可以想到用並查集,在基礎的並查集上增加路徑,用num陣列存第i個船到隊首的距離,用len存這一列的船的個數。問題主要在路徑壓縮上維護num陣列上。可以在find的過程中,每改變f[x]的時候把num[i]加上num[f[i]],就可以維護了。

卡點:在num陣列初始賦值為了1,導致每find一遍,所搜尋的值就加了1(根節點)。沒看清要求求的是中間船的個數,寫成了包括兩頭的。在求出答案時,誤把num[i]-num[j]寫成了num[find[i]]-num[find[j]]

c++ code:

#include#includeconst int maxn=30010;

int n,f[maxn],num[maxn],len[maxn];

char ch[5];

int find(int x)

int abs(int a)

int main()else

printf("%d\n",abs(num[a]-num[b])-1);}}

return 0;

}

洛谷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 銀河英雄傳說

題目 題意 有好多好多艦隊排成一排。m i,j表示將編號i艦隊所在的列排到編號j艦隊所在列的後面。c i,j表示查詢編號i艦隊和編號j艦隊如果在一列,中間間隔了多少只艦,如果不在同一列輸出 1 思路 很自然能想到用乙個陣列可以表示某乙個艦排在這一列的第幾個 當要查詢的時候只需要用並查集查一下隊首相不...