洛谷P5631 最小mex生成樹

2022-06-13 14:00:14 字數 1018 閱讀 7577

給定 \(n\) 個點 \(m\) 條邊的無向連通圖,邊有邊權。

設乙個自然數集合 \(s\) 的 \(\text\) 為:最小的、沒有出現在 \(s\) 中的自然數。

現在你要求出乙個這個圖的生成樹,使得其邊權集合的 \(\text\) 盡可能小。

\(n\leq 10^6,m\leq 2\times 10^6,w_i\leq 10^5\)。

很套路的線段樹分治。

設 \(\text=\max(w_i)\)

考慮分治到 \([l,r]\) 的時候把邊權在 \([0,l)∪(r,\text]\) 的邊全部加上,用可撤銷並查集搞連通塊,設 \(cnt\) 表示合併次數,如果 \(cnt=n-1\) 那麼說明已經形成一棵最小生成樹,輸出 \(l\) 即可。

隨便寫寫就行了。每一條邊會被加入 \(o(\log \text)\) 次,所以複雜度是 \(o(\text(\log\text+\log n))\) 的。

#include #define mp make_pair

using namespace std;

const int n=2000010,w=100010;

int n,m,lim,cnt,father[n],dep[n];

vector> e[w];

stackst;

int read()

int find(int x)

int merge(int x,int y,bool flag)

for (int i=l;i<=mid;i++)

for (int j=0;jcnt+=merge(e[i][j].first,e[i][j].second,0);

if (solve(mid+1,r)) return 1;

return 0;

}int main()

for (int i=1;i<=n;i++)

father[i]=i;

solve(1,lim+2);

return 0;

}

P5631 最小mex生成樹 線段樹,並查集

n nn個點m mm條邊的一張圖,求mex mexme x值最小的一棵生成樹。考慮比較暴力的做法,列舉答案,然後判斷其他邊能否構成一棵生成樹。發現一條邊會被重複加入多次,可以考慮不刪除其他不動的邊。ww的邊,每次把w ww丟到 1,w 1 w 1,1,w 1 cup w 1,infty 1,w 1 ...

P5631 最小mex生成樹 線段樹,並查集

n 個點 m 條邊的一張圖,求 mex 值最小的一棵生成樹。考慮比較暴力的做法,列舉答案,然後判斷其他邊能否構成一棵生成樹。發現一條邊會被重複加入多次,可以考慮不刪除其他不動的邊。時間複雜度 o n log n log w include include include include includ...

線段樹 Mex 洛谷P4137

有乙個長度為n nn的陣列 m mm次詢問,每次詢問乙個區間內最小沒有出現過的自然數。對1 n 1 n1 n這裡能夠的每個數x xx,都統計出來在陣列中出現的位置,並在前補上0 00,在後補上n 1 n 1n 1.例如陣列 其中1 11出現過的位置就是 其中2 22出現過的位置就是 其中3 33出現...