NOIP2024集訓Day47 生成樹+二分圖

Leirt_Abu發表於2024-10-08

NOIP2024集訓Day47 生成樹+二分圖


B. [THUPC2022 初賽] 最小公倍樹

直接建邊顯然不行,考慮最佳化建邊。

對於兩個點 \(u, v\)\((u, v)\) 的邊權為 \(\displaystyle\operatorname{lcm}(u, v) = \frac{u\times v}{\gcd(u, v)}\),顯然應該選擇 \(\gcd(u, v)\) 儘可能大的點對連邊,也就是說 \(u, v\) 的公因子越多越好。

由於 \(L,R\le 10^6\),可以考慮列舉這個公因子。對於因子 \(x\),如果 \(kx\)\([L, R]\) 中,則 \((k + 1)x\)\((k + 2)x\)\(\dots\),這些點向 \(kx\) 連邊是比較優的。所以我們可以找到這個最小的 \(kx\) 作為起點連邊。最後跑 Kruskal 即可。

這個建邊的套路要記住。


C. [CF1120D] Power Tree

很巧妙的一種方法。

首先我們可以把葉子節點按 dfs 序抽象成一個序列,不妨設這個序列長 \(k\)

那麼控制一棵子樹內的葉子節點的點權等同於控制序列一段區間的點權。

全體置零的要求和區間加的操作容易聯想到差分陣列,不妨設差分陣列 \(b_i = a_i - a_{i - 1}, a_0 = 0\)

對於操作區間 \([l, r]\)\(x\),就可以看作是 \(b_l\)\(x\)\(b_{r + 1}\)\(x\),那麼我們就得新建出一個虛點 \(k + 1\)

對於要求全體置零,就可以看做是要求 \(\forall i\in[1,k],b_i=0\)

發現每次操作後差分陣列的總和不會變,所以為了達到要求,必須把所有的值轉移到 \(b_{k + 1}\) 上去。

對於操作區間 \([l, r]\)\(x\),我們可以連邊 \((l, r + 1)\),邊權為 \(x\)

不難發現當且僅當兩個點聯通時,才能把一個點的 \(b\) 值轉移到另一個點上去,且代價為邊權和。

所以題目的要求就是所有的點都要和 \(k + 1\) 聯通,然後問最小代價。

那麼這就是一個最小生成樹能解決的事情了。

至於輸出所有可能在最優方案中的點,也就是輸出所有可能出現在最小生成樹中的邊,可以直接在 Kruskal 的過程中判斷一下就好了。


H. [BZOJ4808] 馬

首先將棋盤 \(01\) 間隔染色,然後就成了二分圖

由於要放最多的馬,其實就是最大獨立集(最大獨立集 = 點數 - 最小點覆蓋 = 點數 - 最大匹配)。

[l,r]:

相關文章