多執行緒程式設計(六)——條件變數(Condition Variable)
阿新 • • 發佈:2020-08-03
題面
題意
樹上一點隨機遊走到另一點距離的期望
樣例
Sample.in
4 2 1 2 2 3 3 4 1 4 3 4View Code
Sample.out
4 2 1 2 2 3 3 4 1 4 3 4View 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板子就好了