2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望

Posted lfri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望相关的知识,希望对你有一定的参考价值。

题意

总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层。接下来有 $q$ 次询问,每次询问 $l$ 层到 $j$ 层的期望代价。

分析

这种期望具有可加性,因此,维护一个前缀和 $sum[i]$:从 $1$ 到 $i$ 的期望。

设从 $i$ 到 $i+1$ 的期望代价为 $E$,则有

$E = a_i + (1-\fracr_is_i)(sum[i]-sum[x_i]+E)$

解得 $E = [s_ia_i + (s_i-r_i)(sum[i]-sum[x_i])]/r_i$

 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 500000 + 10;
ll sum[maxn];
int n, q;

ll qpow(ll a, ll b)

    ll ret = 1;
    while(b)
    
        if(b&1)  ret = ret * a % mod;
        a = a *a % mod;
        b >>= 1;
    
    return ret;

ll inv(ll x)

    return qpow(x, mod-2);


//第i层到第i+1层的期望
void getE(ll i, ll ri, ll si, ll ai, ll xi)

    ll e = si * ai % mod;
    e = (e + (si - ri) * (sum[i] - sum[xi]) % mod);
    e = e * inv(ri) % mod;
    e = (e + mod) % mod;
    sum[i+1] = (sum[i] + e) % mod;


int main()

    int T;
    scanf("%d", &T);
    while(T--)
    
        scanf("%d%d", &n, &q);
        for(int i = 1;i <= n;i++)
        
            ll ri, si, xi, ai;
            scanf("%lld%lld%lld%lld", &ri, &si, &xi, &ai);
            getE(i, ri, si, ai, xi);
        

        for(int i = 0;i < q;i++)
        
            int l, r;
            scanf("%d%d", &l, &r);
            printf("%lld\n", (sum[r] - sum[l] + mod) % mod);
        
    

 

 

参考链接:https://blog.csdn.net/mmk27_word/article/details/99472953

以上是关于2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望的主要内容,如果未能解决你的问题,请参考以下文章

2022 年杭电多校第七场 1007 Weighted Beautiful Tree

2022 年杭电多校第七场 1007 Weighted Beautiful Tree

2019 杭电多校 第七场

升级降级(期望DP)2019 Multi-University Training Contest 7 hdu杭电多校第7场(Kejin Player)

[补]2019HDU杭电多校第五场H

[2019杭电多校第五场][hdu6624]fraction