1. 程式人生 > >[JLOI2012]時間流逝 樹上高斯消元 概率期望

[JLOI2012]時間流逝 樹上高斯消元 概率期望

題面

題意:(感覺題面寫的題意是錯的?)有\(n\)種能量不同的圈,設當前擁有的圈的集合為\(S\),則:
1,每天有\(p\)概率失去一個能量最小的圈。特別的,如果\(S = \varnothing\),那麼這個概率為0.
2,否則將得到一個滿足\(能量 \le S_{min}\)的圈。
\(S\)內的能量和大於\(T\)的期望天數。

題解:處於期望要倒推的考慮,我們設\(f[i]\)表示從狀態\(i\)到合法狀態的期望。
一個能量和大於\(T\)的狀態為合法狀態,顯然有\(f[合法狀態] = 0\),現在我們要求的是\(f[\varnothing].\).
\(last(i)\)表示狀態\(i\)

通過刪去一個圈可以到達的狀態。\(next(i)\)表示狀態\(i\)通過獲得一個圈可以到達的狀態。我們可以列出如下等式:
\[f[i] = 1 + p \cdot f[last(i)] + (1 - p) \frac{1}{|next(i)|}\sum{f[next(i)]}\]
高斯消元?但狀態好像太多了,,,權值和為\(50\)的不同集合個數大概在\(1e5\)的級別,\(n^{3}\)不可能過。所以我們考慮優化。

因為對於一個集合\(S\),去掉一個圈可以到達的狀態是唯一確定的,因此\(last(s)\)只有一個,但\(next(s)\)有多個。
所以如果我們將\(last(s)\)視作\(s\)

的父親,\(next(s)\)視作\(s\)的兒子,那麼我們可以發現,以狀態之間的關係為邊,可以構建出一棵樹。
如果我們可以把\(f[i]\)表示為\(k \cdot f[fa(i)] + b\)的形式,那麼對於任意一個點,我們將它子樹所表示出的所有式子帶入消值,可以使得當前點的式子中最多隻有\(f[i]\)和$f[fa(i)]\(2個狀態。(\)fa(i)\(即\)last(i)$)

我們考慮用歸納法來證明這是可行的:
1,對於葉子節點(合法狀態),因為它本身就沒有兒子,因此一開始就只有自己和父親2個狀態,顯然可以表示成所需狀態。
2,對於非葉節點,考慮證明當兒子滿足條件時,這個節點一定滿足條件。
\[f[i] = 1 + p \cdot f[last(i)] + (1 - p) \frac{1}{|next(i)|}\sum{f[next(i)]}\]


其中\((1 - p) \frac{1}{|next(i)|}\)是一個定值,我們設它為\(G\).那麼:
\[f[i] = 1 + p \cdot f[last(i)] + G\sum{f[next(i)]}\]
變成高斯消元的形式:
\[f[i] - p \cdot f[last(i)] - G\sum{f[next(i)]} = 1\]
其中,因為\(i\)的兒子,也就是\(next(i)\)會被轉化為\(k \cdot f[i] + b\)的性質,因此當我們把\(next(i)\)全都帶入進來後,剩下的式子應該是類似這樣的.其中\(f[i]\)的係數和常數項被改變,於是得到:
\[k_{1}f[i] = k_{2} + p \cdot f[last(i)]\]
稍微化簡一下可以得到:
\[f[i] = \frac{p}{k_{1}} f[last(i)] + \frac{k_{2}}{k_{1}}\]
\(t_{1} = \frac{p}{k_{1}}, t_{2} = \frac{k_{2}}{k_{1}}\),則:
\[f[i] = t_{1}f[last(i)] + t_{2}\]

考慮一點細節上的東西:
\[f[i] - p \cdot f[last(i)] - G\sum{f[next(i)]} = 1\]
考慮將\(f[next(i)] = af[i] + b\)帶入原式會產生什麼樣的影響。
\[-G(af[i] + b) = -Gaf[i] - Gb\]
\(f[i]\)的係數為\(k_{1}\),常數項為\(k_{2}\).
\[f[i] - p \cdot f[last(i)] -Gaf[i] - Gb = 1\]
顯然我們只需要將\(k_{1} -= Ga, k_{2} += Gb\)即可