給定 \(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出現...