題目大意:有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 思路 很自然能想到用乙個陣列可以表示某乙個艦排在這一列的第幾個 當要查詢的時候只需要用並查集查一下隊首相不...