[P1654] OSU! - 期望
Description
一共有 (n) 次操作,每次操作只有成功与失败之分,成功对应 1,失败对应 0,n 次操作对应为 1 个长度为 n 的 01 串。在这个串中连续的 (X) 个 (1) 可以贡献 (X^3) 的分数,这 x 个 1 不能被其他连续的 1 所包含(也就是极长的一串 1,具体见样例解释)。现在给出 n,以及每个操作的成功率,请你输出期望分数。
Solution
连击次数从 x 变成 x+1,答案增加 3xx+3x+1
根据期望的线性性质,我们只需要维护到每个位置的 x 和 xx 的期望即可
对于 x,第 i 次有 p 的概率成功,那么成功的时候,x'=x+1,失败的时候,x'=0
对于 xx,Exx'=p(Exx+2Ex+1)
对于答案,第 i 次提供的增量为 (3Exx+3Ex+1)p
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n;
double a[N];
signed main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
double ans = 0, ex = 0, exx = 0;
for (int i = 1; i <= n; i++)
{
ans += a[i] * (3 * exx + 3 * ex + 1);
exx = a[i] * (exx + 2 * ex + 1);
ex = a[i] * (ex + 1);
}
cout << fixed << setprecision(1) << ans << endl;
}