\(\\\)
有 \(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 或之前 難度提高 省選 提交該題 討論 題解 記錄 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦 創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓...