HDU6656 Kejin Player

Posted zhanggengchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU6656 Kejin Player相关的知识,希望对你有一定的参考价值。

题意

一个人初始在1级,从i级升级到i+1级需要ai的费用,有pi的概率升级成功,(1-pi)的概率升级失败降到xi级。共有n(5e5)级,q(5e5)询问,每组询问查询从L级升到R级花费的期望。
题目连接

思路

这个题关键是期望是可以相减的,也就是说,E(L,R)=E(1,R)-E(1,L)。我们需要dp预处理得到每个E(1,i)记为dp[i],dp[i+1]=dp[i]+a[i]+(1-p[i])*(dp[i+1]-dp[x[i]])。移项化简一下就行了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mo = 1000000000+7;
const int maxn = 500000+10;

inline LL read()
    LL f=1,x=0;
    char s=getchar();
    while(s<'0' || s>'9')
        if(s=='-')
            f=-1;
        s=getchar();
    
    while(s>='0' && s<='9')
        x=x*10+s-'0';
        s=getchar();
    
    return x*f;


int n,q;
LL r[maxn],s[maxn],x[maxn],a[maxn];
LL dp[maxn];

LL power(LL x,int y)

    LL ans=1;
    while (y)
    
        if (y&1) ans=ans*x%mo;
        x=x*x%mo;
        y>>=1;
    
    return ans;


int main()

    int T;
    scanf("%d",&T);
    while (T--)
    
        n=read(); q=read();
        for (int i=1;i<=n;i++) r[i]=read(),s[i]=read(),x[i]=read(),a[i]=read();
        dp[1]=0;
        for (int i=1;i<=n;i++) dp[i+1]=(  dp[x[i]]+( ((s[i]*power(r[i],mo-2))%mo)*((dp[i]+a[i]-dp[x[i]]+mo)%mo) )%mo  )%mo;
        for (int i=1;i<=q;i++)
        
            int l=read(),r=read();
            LL ans=(dp[r]-dp[l]+mo)%mo;
            printf("%lld\n",ans);
        
    
    return 0;

以上是关于HDU6656 Kejin Player的主要内容,如果未能解决你的问题,请参考以下文章

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

HDU 1429--胜利大逃亡(续)BFS &amp;&amp; 状态压缩

2019 Multi-University Training Contest 7 Kejin Player Final Exam

如何用“重复出现”的列重塑数据框?

k8s的yaml文件配置详解(转))

腾讯会议使用OBS虚拟摄像头