NOI 2002 銀河英雄傳說

2022-03-30 01:43:06 字數 993 閱讀 3962

\(\\\)

有 \(n\) 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。

有 \(m\) 次操作:

注意每一列戰場的戰艦都是排成一列的。

\(\\\)

帶偏移量的並查集。

記錄 \(d[x]\) 表示 \(x\) 到所在列頭的一段上共有多少個戰艦。

記錄 \(sz[x]\) 表示 \(x\) 所在的一列有多少個戰艦。

為了保證複雜度,我們在做的時候還是要路徑壓縮。

但是 \(d[x]\) 怎麼保證正確?遞迴的時候這麼寫就好了。

int find(int x)
注意是 \(d[x]+=d[f[x]]\),因為之前可能路徑壓縮過。還有注意 $f[x] $ 的更新時間。

合併的時候,記 \(f_i\) 表示 \(i\) 所在一列的列頭,\(f_j\) 表示 \(j\) 所在的列頭,有

\[d[f_i]=sz[f_j]

\]查詢的時候,\(find\) 的過程中已經保證了兩位置的 \(d\) 陣列數值正確,所以在一列的兩個戰艦答案就是

\[|d[x]-d[y]|-1

\]\(\\\)

#include#include#include#include#include#include#include#define n 30010

#define r register

#define gc getchar

using namespace std;

inline int rd()

while(isdigit(c))

return f?-x:x;

}struct ufs}

int find(int x)

inline void merge(int x,int y)

}ufs;

int main()

else

} return 0;

}

NOI2002 銀河英雄傳說

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

NOI2002 銀河英雄傳說

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

NOI2002 銀河英雄傳說

題目提供者該使用者不存在 標籤並查集noi系列2001 或之前 難度提高 省選 提交該題 討論 題解 記錄 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦 創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓...