P8314 Parkovi 題解

Laijinyi發表於2024-07-29

題意:樹,邊有邊權,求一種選出 \(k\) 個點染色的方案,使得每個點到最近的一個被染色點的距離的最大值最小,\(n\le2\cdot10^5\).

Solution

先看部分分:

  • \(n\le 20\):直接 \(C_n^k\) 爆搜.
  • \(k=1\):對每個點 \(u\) 求出 \(f(u)\)\(g(u)\) 分別表示 \(u\) 到子樹內點距離的最大值、\(u\) 到子樹外點距離的最大值. 這是可以轉移的:\(f(u)\) 從兒子轉移而來,\(g(u)\) 從父親的 \(g\) 和兄弟的 \(f+w(v,fa(v))\) 的前字尾最大值得到.
  • 鏈:二分答案,發現 check 直接貪心地染色即可.

我們從鏈的部分分類似地推廣,考慮樹能不能貪心地染色. 感受一下,發現其實是可以的!策略大概是我們想要染色點儘量靠上。

具體地說,我們二分 \(x\) 表示最大距離為 \(x\),定義 \(u\) 被已經染色的 \(v\) “覆蓋”當且僅當它們距離 \(\le x\),問題變成了選最少的點染色使得整棵樹被覆蓋.

考慮自底向上地貪心染色,每次想要一棵子樹被覆蓋. 記 \(mx(u)\)\(u\) 子樹內未被覆蓋的點與 \(u\) 距離的最大值,\(u\) 必須染色的條件大概就是 \(mx(u)\le x\)\(mx(u)+w(u,fa(u))>x\),現在問題變成了維護 \(mx(u)\).

\(mx(u)\) 可以從兒子得到,於是一個簡單的想法是 \(mx(u)=\max_{v\in son(u)}\{mx(v)+w(u,v)\}\). 但是有個 bug:可能 \(u\) 子樹中的點被 \(u\) 兄弟子樹中的染色點所覆蓋!

發現這也是好修的:再記 \(mn(u)\)\(u\) 子樹內距離 \(u\) 最近的染色點的距離,顯然 \(mn\) 可以轉移,而 \(mx\) 再加個關於 \(mn\) 的條件就行了.


上面是思路,下面是具體式子與細節:

\[ mx(u)=\max_{v\in son(u)\land mn(u)+w(u,v)+mx(v)>x}\{ mx(v)+w(u,v) \}\\ mn(u)=\min_{v\in son(u)}\{ mn(v)+w(u,v) \} \]

\(u\) 被染色的條件:\(mx(u)+w(u,fa(u))>x\)

\(u\) 被染色時,\(mx(u)=-\inf,mn(u)=0\)

注意初始 \(mx=-\inf,mn=\inf\)

特判:根的 \(mn\) 不為 \(\inf\) 時必須得染色.

最後輸出答案時,若點數不足 \(k\),就再隨便亂選幾個點湊足 \(k\) 即可.

時間:\(O(n\log V)\)\(V\) 為值域(1e9)