大意:你有30000個佇列,第i個佇列中只有i
有t個操作,1,把某個佇列頭接到另乙個佇列尾。
2,問兩個元素之間的距離。
本題主要有三種解法。
①帶權並查集。
具體來說就是,並查集維護當前集合的大小,這個點距離代表元(隊首)的邊數。
然後把合併和路徑壓縮魔改一下。詢問的時候就直接取距離之差。
1 #include 2ac**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 }
②平衡樹
這個太暴力了......開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 思路 很自然能想到用乙個陣列可以表示某乙個艦排在這一列的第幾個 當要查詢的時候只需要用並查集查一下隊首相不...