1. 程式人生 > >AGC007 - C Pushing Ball

AGC007 - C Pushing Ball

name ask i+1 () task math 得出 char 給定

Description

題目鏈接 懶得寫詳細題意了, 放個鏈接

\(n\le 2*10^5\) 個球, \(n+1\) 個坑, 排成數軸, 球坑交替. 相鄰球-坑距離為等差數列 \(d\). 給定首項與公差. 每次隨機選一個球並隨機往一個方向推, 求期望經過距離總和

Solution

手玩觀察一下, 球不可能沒坑掉, 每次推完一個球後變成 \(n-1\) 個球的子問題.

對於每一個子問題, 只考慮推第一個球的期望距離 (\(\frac{\sum_{i=1}^{2n}d_i}{2n}\)) , 其他的在子問題中處理.

考慮對於任意一個子問題, 假設有 \(n\) 個球, 則有 \(2n\) 個子狀態, 每個子狀態的概率 \(\frac 1{2n}\)

子狀態中 \(d‘\) 可根據當前問題的 \(d\) 經過線性運算得出, 推第一個球的期望距離也可由 \(d\) 線性運算得出.

因此, 我們可以將這 \(2n\) 個子問題合並, 合並的子問題中 \(d‘‘_i = E[d‘_i]\). 下面觀察 \(d‘‘\) :

下面的圖中, 記o為球, d為當前子問題的(期望)每段段長, _為坑, 新d‘‘是從左往右標號的.
   o     o     o     o     考慮每種球掉落方案, 邊界球往邊界坑掉 是 特殊情況, 其余:
 d1 d2 d3 d4 d5 d6 d7 d8   將相鄰的三個d加在一起合成一段, 其他不變. 記段為(l,r)
_     _     _     _     _  那麽l=1..2n-2, 考慮每個di (1<=i<=n) 的貢獻

\(l\le i-2\) 時, \(d_i\to d‘‘_{i-2}\). \(l=i-1\) 時, \(d_i\to d‘‘_{i-1}\). \(l\ge i\) 時, \(d_i\to d‘‘_{i}\) , 總的來看就是

\(d‘‘_i = d_i+d_{i+2}+i*d_{i+2}+d_{i+1}+(2n-2-i+1)*d_i=(2n-i)d_i+d_{i+1}+(i+1)d_{i+2}\)

\(=(2n+2)d_0+3\Delta + (2n+4)i\Delta\) , 於是原問題等差, 合並後子問題等差, \(\cdots\), 都等差.

實現很簡單

Code

#include <cstdio>
#include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #define rep(i, a, b) for (int i = (a), _ = (b); i <= _; ++ i) #define per(i, a, b) for (int i = (a), _ = (b); i >= _; -- i) #define For(i, a, b) for (int i = (a), _ = (b); i < _; ++ i) #define ri rd<int> typedef long double db; using namespace std; template<class T> inline T rd() { bool f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = 0; T x = 0; for (; isdigit(c); c = getchar()) x = x * 10 + c - 48; return f ? x : -x; } int n; db d0, delta, ans; inline db calc(db d0, db delta, db len) { return len * d0 + delta * len * (len + 1) / 2; } int main() { n = ri(), d0 = ri(), delta = ri(), d0 -= delta; per (i, n, 1) { ans += calc(d0, delta, 2 * i) / (2 * i); d0 = (2 * i + 2) * d0 + 3 * delta; delta *= (2 * i + 4); d0 /= 2 * i; delta /= 2 * i; } printf("%.15Lf\n", ans); return 0; }

AGC007 - C Pushing Ball