NOI2002 銀河英雄傳說(帶權並查集好題)

2021-10-18 23:06:55 字數 842 閱讀 9719

題解:

用兩個變數來維護:

1.sz[i]維護第i列元素的個數

2.pre[x]維護第x元素到當前隊首的距離。

在並查集是不斷維護這兩個值。

至於如何維護看下圖和文字解釋

對於任意乙個飛船,我們都知道它的祖先(不一定是隊頭,但一定間接或直接指向隊頭),還知道距離它祖先的距離。對於每乙個飛船,它到隊頭的距離,就等於它到它祖先的距離加上它祖先到隊頭的距離 pre[x]+=pre[f[x]];(在並查集過程中不斷維護即可)

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

//#define int long long

#define endl '\n'

using

namespace std;

const

int maxn=

5e5+10;

const

int mod=

1e9+7;

int f[maxn]

,pre[maxn]

,sz[maxn]

;int

ifind

(int x)

void

init()

}signed

main()

else

}}

NOI2002 銀河英雄傳說

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

NOI 2002 銀河英雄傳說

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

NOI2002 銀河英雄傳說

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