zoukankan      html  css  js  c++  java
  • 2019杭电多校第七场 HDU

    题意

    总共有 $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-frac{r_i}{s_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
    ", (sum[r] - sum[l] + mod) % mod);
            }
        }
    }

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

  • 相关阅读:
    微服务云部署
    监控linux服务器
    k6 常见测试模式说明
    k6 使用参考
    dremio 开发测试简单说明
    cube.js prepareCompiler api 试用
    cube.js schema 预编译处理
    cube.js driver 开发一些说明
    cube.js mssql driver 问题
    cube.js s3 FileRepository 新功能
  • 原文地址:https://www.cnblogs.com/lfri/p/11360441.html
Copyright © 2011-2022 走看看