• F - Double Chance(期望,数学,树状数组优化)[AtCoder Beginner Contest 276]


    题目如下:

    在这里插入图片描述
    F - Double Chance 题目链接

    思路 or 题解:

    期望公式: ∑ v a l × p \sum val \times p val×p
    还可以细分:
    如果两次抽出的值是相同的,都是 x x x,那么抽出的方案数为 c n t x × c n t x cnt_x \times cnt_x cntx×cntx
    如果两次抽出的值不同,那么抽出的方案数为: c n t x × m i n x cnt_x \times min_x cntx×minx
    m i n x min_x minx 指的是小于 x x x的个数

    综上所述:
    抽出最大值为 x x x的概率为: c n t x 2 + c n t x ∗ m i n x ∗ 2 m 2 ∗ x \frac{cnt_x^2 + cnt_x * min_x * 2}{m^2} * x m2cntx2+cntxminx2x
    其中 m m m 为袋子里的元素个数

    时间复杂度: O ( n 2 ∗ l o g n 2 ) O(n^2 * logn^2) O(n2logn2)

    优化:

    此处我们将上述公式的 m 2 m^2 m2 中的 m m m 改成输出中的 n n n,方便分数加法,最后乘上 n 2 m 2 \frac{n^2}{m^2} m2n2 即可

    式子变为:
    ( 2 c n t x − 1 ) + 2 m i n x n 2 × x \frac{(2cnt_x - 1) + 2min_x}{n ^ 2} \times x n2(2cntx1)+2minx×x

    显然 c n t cnt cnt 2 c n t x n 2 \frac{2cnt_x}{n^2} n22cntx 都可以用树状数组存,以 x x x 为下标即可。

    AC代码:

    #define int long long
    //#define int long long
    #define PII pair<int, int>
    #define px first
    #define py second
    typedef std::mt19937 Random_mt19937;
    Random_mt19937 rnd(time(0));
    using namespace std;
    const int MOD = 998244353;
    const int N = 400009;
    int n;
    int ksm(int a, int b, int p)
    {
        a %= p;
        int ret = 1;
        while (b)
        {
            if (b % 2)
                ret = ret * a % p;
            a = a * a % p;
            b /= 2;
        }
        return ret;
    }
    #define getny(x, p) (ksm(x, (p)-2, p))
    #define fracny(x, y, p) (((x) % (p)) * getny(y, p) % (p))
    
    int cnt[N];
    
    int pfn;
    
    #define lowbit(x) ((x) & (-(x)))
    int c[N]; // cnt
    void add(int x, int v)
    {
        for (int i = x; i <= 2e5; i += lowbit(i))
            c[i] += v;
    }
    int query(int x)
    {
        int ret = 0;
        for (int i = x; i; i -= lowbit(i))
            ret += c[i];
        return ret;
    }
    int c1[N]; //((cnt*2)/(n^2))*x
    void add1(int x, int v)
    {
        for (int i = x; i <= 2e5; i += lowbit(i))
            c1[i] += v;
    }
    int query1(int x)
    {
        int ret = 0;
        for (int i = x; i; i -= lowbit(i))
            ret += c1[i];
        return ret;
    }
    
    #define gm(x) (((x) % MOD + MOD) % MOD)
    
    int ans;
    
    void add(int x)
    {
        pfn++;
    
        cnt[x]++;
        add(x, 1);
        add1(x, fracny(2, n * n, MOD) * x % MOD);
        ans = (ans + fracny(2 * cnt[x] - 1 + query(x - 1) * 2, n * n, MOD) * x % MOD) % MOD;
    
        ans = (ans + gm(query1(2e5) - query1(x))) % MOD;
    }
    
    void solve()
    {
        buff;
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            int x;
            cin >> x, add(x);
            cout << ans * fracny(n * n, pfn * pfn, MOD) % MOD << '\n';
        }
    }
    signed main()
    {
        buff;
        solve();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    参考文章
    感谢:
    在这里插入图片描述

  • 相关阅读:
    前端设计模式
    【Pytorch】模型的可复现性
    引领办公新潮流,乐歌M9M升降办公电脑台——让工作更轻松
    Spring源码(十二)reflush方法下的消息资源按和监视器初始化
    【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统
    IBL(Image-Based Lighting)
    XCIE-HUAWEI-双点双向引入带来的问题以及解决办法(三种)+各种路由环路
    SQL优化
    计算机组成原理-主存储器与CPU的连接
    【数据结构】基础:堆
  • 原文地址:https://blog.csdn.net/m0_60593173/article/details/127863348