P1196 銀河英雄傳說

2022-05-24 07:09:08 字數 858 閱讀 4562

這題真的很經典,我wa了三次,最後一次才ac……

因為這道題是很有技術含量的,能自己寫出來真的很厲害(不是在誇自己)。如果只是粗略的去看題解或者抄題解(倒是可以用來矇騙自己),那這道題就失去意義了。下面的**,每一句話,都是值得深刻推敲的。

舉幾個例子:

int find(int

x)

這裡就不能直接寫par [ x ] = find ( par [ x ] ),後面寫return par [ x ] 。(為什麼想過麼?)

而且粗略地想:深度不應該是父親 + 1 嗎?而且每一次都把深度加一遍,不會有錯嗎?

如果你這麼想,那麼首先你並沒有掌握並查集的本質和基礎的定義,需要再踏踏實實搞好基礎;如果你根本就沒想到這一點,而是直接欺騙自己感性地理解,那麼你只是背了乙個最普通的板子,並且和沒學過沒有區別,不可能獨立敲出這道題。

而這只是一部分,要不我也不會說這道題經典……

太晚了,不解釋為什麼了,如果你感興趣,可以來窗邊第一號機位。

**貼上:(可能沒有題解寫得好)

#include#include

#include

using

namespace

std;

#define maxn 3000005

intn,dp[maxn],par[maxn],am[maxn];

int find(int

x)void merge(int x,int

y)int

main()

else

printf(

"%d\n

",abs(dp[y]-dp[x])-1

); }

}}

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