疊積木 銀河系英雄傳說 NOI2002 題解

2022-06-19 18:33:17 字數 885 閱讀 5594

題目右轉 luogu p2342

其實這道題和 [noi2002]銀河英雄傳說

一模一樣(雙倍經驗)

言歸正傳:

題目中的 「移動 \(x\) 到 \(y\) 的上面」 操作可以看成是在並查集中將 \(x\) 和 \(y\) 合併入同乙個集合

而對於 「統計 \(z\) 下方的積木數量」 操作,我們需要維護兩個陣列:\(high[x]\) 表示第 \(x\) 中積木的數量, \(under[x]\) 表示積木 \(x\) 下方的積木數量

為什麼要維護 \(high[x]\) 呢 \(?\) 原因是並查集一旦經過路徑壓縮之後,所有節點都會連到根節點(也就是說,當兩個集合合併後,同時都連到了根節點,成為了並列的節點,不存在誰在誰上面了)

\(high\) 陣列可以在和並的時候維護,如:將以 \(r1\) 為根的積木移動到以 \(r2\) 為根的積木上方

\(high[r2]+=high[r1],high[r1]=0;\)

\(under\) 陣列就麻煩一點了,不僅在合併的時候需要維護:

\(under[r1]=high[r2];\)

在路徑壓縮的時候也需要維護一下:

int get(int x)

就到這裡了,接下來貼** 有點小激動

#includeusing namespace std;

const int maxn=30001;

int f[maxn],under[maxn],high[maxn],n;

int get(int x)

void u(int x,int y)

int main()

else

}return 0;

}

NOI2002 銀河英雄傳說

noi2002 day1 t1 公元5801年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織...

NOI 2002 銀河英雄傳說

有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...

NOI2002 銀河英雄傳說

公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵...