• BZOJ 3450


    描述

    某一天 WJMZBMR 在打 osu~~~ 但是他太弱逼了,有些地方完全靠运气:(
    我们来简化一下这个游戏的规则:
    (n(nle 300000)) 次点击要做,成功了就是 o,失败了就是 x,分数是按 comb 计算的,连续 (a) 个 comb 就有 (a^2) 分,comb 就是极大的连续 o
    比如 ooxxxxooooxxx,分数就是 (2 imes 2+4 imes 4=4+16=20)
    Sevenkplus 闲的慌就看他打了一盘,有些地方跟运气无关要么是 o 要么是 x,有些地方 o 或者 x 各有 (50\%) 的可能性,用 ? 号来表示。
    那么 WJMZBMR 这场 osu 的期望得分是多少呢?

    思路:

    这个题如果一段一段的处理,实际上并不是很好做。我们观察到 ((x + 1) ^ 2 - x ^ 2 = 2x + 1),那么根据期望的线性性质,我们可以单独算每一个字符的贡献。我们设 (dp_i) 为考虑前 ii 个字符的期望得分,(l_i) 为以 (i) 为结尾的 comb 的期望长度,(Comb_i) 为第 (i)个字符,那么有 3 种情况:

    1. (s_i = o) ,则 (dp_i = dp_{i - 1} + l_{i - 1} * 2 + 1,l_i = l_{i - 1} + 1)
    2. (s_i = x) ,则 (dp_i = dp_{i - 1})
    3. (s_i = ?), 则 (dP_i = dp_{i - 1} + frac{l_i*2 + 1}{2},l_i = frac{l_{i - 1} + 1}{2})

    对于前两种情况,其实是非常直观的,对于第三种情况,实际上是求了一个平均长度。例如 ?oo,两种情况的长度 (l_i) 分别为 ([0,1,2])([1,2,3]) ,但是求了平均之后,长度 (l_i) 变成了 ([0.5,1.5,2.5]) ,这样由于我们的贡献是一个关于长度的一次多项式 ((2x + 1)) ,所以长度平均之后,贡献也相当于求了一个平均,自然能够求得正确的得分期望。

    【AC Code】

    const int N = 3e5 + 10;
    double dp[N], Comb[N];
    int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int n; string s;
        cin >> n >> s;
        for (int i = 0; i < n; ++i) {
            if (s[i] == 'o') {
                dp[i] = dp[i - 1] + Comb[i - 1] * 2 + 1;
                Comb[i] = Comb[i - 1] + 1;
            } else if (s[i] == 'x') {
                dp[i] = dp[i - 1];
                Comb[i] = 0;
            } else {
                dp[i] = dp[i - 1] + (Comb[i - 1] * 2 + 1) / 2;
                Comb[i] = (Comb[i - 1] + 1) / 2;
            }
        }
        cout << setprecision(4) << fixed << dp[n - 1];
    }
    

    思考:如果长度为 (a) 的 comb 的贡献为 (a^3) 时该如何解决?题目链接:Here

    Tips:由于 ((a + 1)^3 - a^3 = 3a^3 + 3a + 1) ,所以我们要维护 (a^2)(a) 的期望,注意 (E_{a^2} ot= E^2_a),所以维护 (a^2) 的期望是必要的。

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    应用程序发生异常,未知的软件异常0x0eedfade,位置为0x0000001355C
    关于条件表达式的理解
    *p++、*++p、(*p)++、++(*p)的比较
    排序算法01_选择排序
    递归_汉诺塔问题
    排序算法00_冒泡排序
    深入理解C语言
    虚拟机_第一篇---创建Linux虚拟机
    虚拟机_第〇篇---虚拟机的下载安装与功能简介
    对i++与++i的理解
  • 原文地址:https://www.cnblogs.com/RioTian/p/15046503.html
Copyright © 2020-2023  润新知