[LOJ#2478][九省聯考2018]林克卡特樹(樹形DP+帶權二分)
Address
Solution
簡版題意:在一棵
個節點的邊帶權樹上刪掉
條邊再加上
條權為
的邊組成一棵新樹,最大化新樹的直徑。
容易發現,如果刪掉的
條邊給定,那麼答案就是這
個連通塊的直徑之和。
於是問題轉化成在樹上選出
條不相交的路徑的最大權值和。點視為退化的路徑。
樹形 DP :
表示
的子樹內選出
條路徑,根的度數為
或
或
的最大收益。
注:特殊情況:如果
沒有被選出則度數為
,如果
單獨作為一條路徑則度數為
。
轉移即列舉子節點
進行各種討論,設
為
之前的 DP 陣列。下面我們先不考慮
單獨作為一條路徑的情況。
其中
和
為
內任意數。
其中
為邊
的權。
最後算上
單獨作為一條路徑的貢獻,還是一樣的樹形揹包。這裡略去。
最後答案:
複雜度
?
?
而對於包含「
個」這樣約束的問題,我們可以考慮使用帶權二分(又稱 wqs 二分、凸優化)去掉「
個」的約束。
如果你有興趣將 i 從 1 到 k+1 把 max(f[u][i][0],f[u][i][1],f[u][i][2]) 的值全部打出來, 可以發現這是一個單峰函式,在最大值左邊遞增,右邊遞減。然後如果你還有興趣將打出來的陣列進行差分, 那麼又可以發現差分後的陣列是單調遞減的。
我們考慮給每條路徑加上一個權值
。
當
時,最優方案是隻選一條路徑。
當
時,最優方案是選出
條只包含一個點的路徑。
並且隨著
的增加,最優方案選出的路徑數單調不減。
所以我們二分
,
去掉第二維後轉移方程變成: