CF1120D Power Tree(树形DP/构造+差分+最小生成树)
解法一:樹形DP
個(gè)人覺得這個(gè)方法是比較可能想到的,但是輸出方案很惡心
先轉(zhuǎn)換題意:“無論怎樣規(guī)定葉子的初始點(diǎn)權(quán),都可以通過操作你選擇的點(diǎn)來讓所有葉子的點(diǎn)權(quán)清空”意味著每個(gè)葉子節(jié)點(diǎn)都可以通過一系列操作單獨(dú)+1、-1
模擬一下就可以發(fā)現(xiàn),以u為根的子樹中,
要想通過控制 uuu 或 uuu的祖先(不管是 uuu 還是 uuu的祖先 都同時(shí)覆蓋了子樹內(nèi)的所有葉子節(jié)點(diǎn))
使子樹內(nèi)所有葉子節(jié)點(diǎn)均可以單獨(dú)+1、-1,
至多一個(gè)葉子節(jié)點(diǎn)未被覆蓋,
且被覆蓋的葉子節(jié)點(diǎn)一定要可以單獨(dú)+1、-1
那么狀態(tài)定義就很顯然了:
f[u][0]f[u][0]f[u][0] 表示以 uuu 為根的子樹內(nèi)葉結(jié)點(diǎn)全部被覆蓋,
f[u][1]f[u][1]f[u][1] 表示以 uuu 為根的子樹內(nèi)葉結(jié)點(diǎn)剩一個(gè)未覆蓋
狀態(tài)轉(zhuǎn)移方程為:
uuu 非葉子節(jié)點(diǎn):
f[u][1]=∑f[vi][0]?max{f[vi][0]?f[vi][1]}f[u][1]=\sum f[v_i][0]-max\{ f[v_i][0]-f[v_i][1]\}f[u][1]=∑f[vi?][0]?max{f[vi?][0]?f[vi?][1]}
f[u][0]=min{∑f[vi][0],f[u][1]+c[u]}f[u][0]=min\{\sum f[v_i][0],f[u][1]+c[u]\}f[u][0]=min{∑f[vi?][0],f[u][1]+c[u]}
uuu 為葉子節(jié)點(diǎn):
f[u][1]=0f[u][1]=0f[u][1]=0
f[u][0]=c[u]f[u][0]=c[u]f[u][0]=c[u]
至于如何輸出方案,可以看一下這里
解法二:構(gòu)造 + 差分 + 最小生成樹
博客
補(bǔ)充一下自己的理解:
區(qū)間加操作,lul_ulu? 加一個(gè)數(shù),ru+1r_u+1ru?+1 減一個(gè)數(shù),最后每個(gè)數(shù)的實(shí)際值是前面各數(shù)(包括自己)的和
題目要求第1至k個(gè)數(shù)的前綴和均為0,
則第1至k個(gè)數(shù)均為0,只有第k+1個(gè)數(shù)最后不為0(即前面的數(shù)通過操作把值全部轉(zhuǎn)移到第k+1個(gè)數(shù)去)
操作就是我們連的邊
那么就只有選擇的邊構(gòu)成連通圖才能辦到
總結(jié)
以上是生活随笔為你收集整理的CF1120D Power Tree(树形DP/构造+差分+最小生成树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 病树前头万木春前一句 这句话出自哪里
- 下一篇: MST(最小生成树)上的确定性和存在性问