[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;
}

相关文章: