1. 程式人生 > 實用技巧 >單調棧與單調佇列

單調棧與單調佇列

題面

題意

樹上一點隨機遊走到另一點距離的期望

樣例

Sample.in

4 2
1 2
2 3
3 4
1 4
3 4 
View Code

Sample.out

4 2
1 2
2 3
3 4
1 4
3 4 
View Code

題解

考慮dp,發現我們很多東西不確定。但是u -> v必定會經過lca(u,v),從這方面入手

記錄 sf [ p ] 是 p 到 fa[ p ] 距離的期望,fs [ p ] 是 fa [ p ] 到 p 的期望,答案可以分為 u->lca(u,v) 的一段 sf 和 lca(u,v)->v 的一段 fs

記錄 deg [ p ] 為 p 的度

對於 sf, 可以由p一步到fa[p],也可以在 p 自己的子樹內亂走到 p

就是f [ u ]=1+( f [ v ] ) / deg [ u ] + ( 1 - 1 / deg [u] ) * f [ u ]

發現變成了f [ u ] = deg [ u ] + f [ v ]

一開始沒懂第一項的那個 1 ,其實這是因為無論如何都會至少走一步,不屬於其他點的貢獻,下面也是這樣

對於 fs ,可以從爸爸一路過來,也可以從爸爸的子樹重新上到爸爸過來

就是 fs [ u ] = 1 / deg[ fa[ u ] ] + (1+ fs[ u ] + fs[ fa[ u ] ]) / deg[ u ] + (1 + fs[ u ]+ sf[ v ]) / deg[ u ]

發現變成了g[ u ] = ( 1 + deg[ u ] + g[ fa[ u ] ] + f [ v ] ) / ( siz[ fa[ u ] - 1 - deg[ u ] )

這個是上來啊,手一抖寫錯,然後調死了

再堆個lca板子就好了