1. 程式人生 > >【口胡】【坑:對偶問題】【Codeforces 671D】【JZOJ 5369】 幽雅的綻放吧,墨染之櫻

【口胡】【坑:對偶問題】【Codeforces 671D】【JZOJ 5369】 幽雅的綻放吧,墨染之櫻

Description

給定一顆N個節點的樹,現在有M個工人,每個工人有三個屬性ui,vi,Ci,表示這名工人可以維修節點ui到節點vi的所有路徑,花費為Ci,並且保證vi是ui的祖先(祖先後代鏈)。問最少花費多少使得樹上的每條邊都有人維修。
N,M≤300000
Ci≤10^9

線段樹優化dp轉移

設f[i]表示做完i的子樹及i向其父親的邊,所需最小代價
考慮一條祖先後代鏈的貢獻,鏈頂為x,鏈底為y
那麼f[y]可以更新鏈上除f[x]以外的狀態,並且需要加上中間一坨點的兒子的f和
設sum[i]表示i的所有兒子的f的和,那麼貢獻可以寫成sumf\sum sum-\sum f(都是一條鏈)的形式
從下往上做,做到v點時,考慮其子樹內有多少個合法鏈底能更新f[v],取代價最小那個,所以我們要動態更新代價
維護子樹可以用線段樹維護dfs序,老套路了
考慮往上一格,如果超出某條鏈範圍,就將該鏈鏈底位置賦值為不合法
否則考慮貢獻,同一個兒子的子樹內的所有鏈底的增量都是一樣的,可以區間修改的
O(nlogn)

對偶問題

這。。。我還不會,留坑先