[BZOJ4585][Apio2016]Fireworks 煙火表演(樹形 DP + 凸包 + 左偏樹)
阿新 • • 發佈:2018-11-23
Address
洛谷 P3642
BZOJ 4585
UOJ #205
LOJ #2568
Solution
- NOIP 2018 之後 A 掉的第一道題,祭
- 看上去是水題,但是發現邊權可以減一之後就不是那麼容易了
- 很容易想到狀態: 表示把 到子樹內所有葉子的距離都調成 的最小代價(下面 為邊 的長度)
可以大膽猜想是關於 的下凸函式- 假設 只有 一個子節點
- 設 時 取得最小值
- 然後分類討論一下轉移:
- (1)
- 這時候 ,最優的方案是把 的邊權改成
- (2)
- 這時候最優的方案是把 的邊權改成
- (3)
- 這時候最優的方案是不修改 的邊權
- (4)
- 這時候最優的方案是把 的邊權改成
- 把 和 看作分段函式,可以發現每個段都是一次的
- 上面四個轉移相當於
- (1)把橫座標 內的直線上移 個單位
- (2)把橫座標 內的直線右移 個單位
- (3)在橫座標 內加入一條斜率為 的直線
- (4)在橫座標 內加入一條斜率為 的直線
- 我們考慮維護分段函式的拐點
- 注意到每經過一個拐點,函式的斜率加一
- 對於葉子節點,有兩個拐點
- 這是一棵樹,處理點 時如何將 轉移到 父親 呢
- 先說:最右端直線的斜率是 u 的子節點數(接下來會證明)
- 用一個大根堆維護拐點橫座標
- 先不斷彈出最右端斜率大於 的直線,使得最後一段直線的斜率為
- 然後把斜率為 的直線段對應的兩個拐點右移 個單位 <