洛谷P1196 銀河英雄傳說

2022-04-30 13:33:15 字數 878 閱讀 4549

大意:你有30000個佇列,第i個佇列中只有i

有t個操作,1,把某個佇列頭接到另乙個佇列尾。

2,問兩個元素之間的距離。

本題主要有三種解法。

①帶權並查集。

具體來說就是,並查集維護當前集合的大小,這個點距離代表元(隊首)的邊數。

然後把合併和路徑壓縮魔改一下。詢問的時候就直接取距離之差。

1 #include 2

3const

int n = 30010;4

5int

fa[n], sum[n], siz[n];

6char str[5];7

8 inline int find(int x, int &s)

13int t =find(fa[x], s);

14 s +=sum[x];

15 sum[x] =s;

16return fa[x] =t;17}

1819 inline void merge(int x, int

y) 28

29 inline int ask(int x, int

y) 36

return (a > b ? a - b : b - a) - 1;37

}3839int

main()

46for(int i = 1, x, y; i <= n; i++)

51else54}

5556

return0;

57 }

ac**

②平衡樹

這個太暴力了......開30000顆平衡樹即可。

③離線(kruskal重構樹)

重構的時候把順序搞一下,然後提出來dfs序,直接回答詢問。

洛谷 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的過程...

洛谷P1196 銀河英雄傳說

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