题意:

最低等级\(level\ 1\),已知在\(level\ i\)操作一次需花费\(a_i\),有概率\(p_i\)升级到\(level\ i+1\),有\(1 - p_i\)掉级到\(x_i(x_i <= i)\),询问\(q\)次,问你每次从\(l\)升级到\(r\)的花费的期望。

思路:

我们设\(dp[i]\)为从\(1\)升级到\(i\)的期望花费,那么显然有从\(l\)升级到\(r\)的期望花费为\(dp[r] - dp[l]\)。

然后我们可以知道,升级到\(i\)有两种情况:

已经花费了\(dp[i-1]\)必加。从\(i-1\)升级,那么花费\(a_{i-1}\);掉级到\(x_{i-1}\)再升到\(i\),那么花费\(a_{i-1} + dp[i]-dp[x_{i-1}]\),那么可以列出方程:

\[dp[i] = dp[i -1] + p_{i-1}*a_{i-1} + (1-p_{i-1})*(dp[i]-dp[x_{i-1}]+a_{i-1})
\]

化简后可得正解。

代码:

  1. #include<map>
  2. #include<set>
  3. #include<queue>
  4. #include<cmath>
  5. #include<stack>
  6. #include<ctime>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<string>
  11. #include<sstream>
  12. #include<iostream>
  13. #include<algorithm>
  14. typedef long long ll;
  15. typedef unsigned long long ull;
  16. using namespace std;
  17. const int maxn = 5e5 + 5;
  18. const ll MOD = 1e9+7;
  19. const ull seed = 13131;
  20. const int INF = 998244353;
  21. ll dp[maxn];
  22. ll r[maxn], s[maxn], x[maxn], a[maxn];
  23. ll ppow(ll a, ll b){
  24. ll ret = 1;
  25. while(b){
  26. if(b & 1) ret = ret * a % MOD;
  27. b >>= 1;
  28. a = a * a % MOD;
  29. }
  30. return ret;
  31. }
  32. int main(){
  33. int T;
  34. scanf("%d", &T);
  35. while(T--){
  36. int n, q;
  37. scanf("%d%d", &n, &q);
  38. for(int i = 1; i <= n; i++){
  39. scanf("%lld%lld%lld%lld", &r[i], &s[i], &x[i], &a[i]);
  40. }
  41. dp[1] = 0;
  42. for(int i = 2; i <= n + 1; i++){
  43. ll inv = ppow(r[i - 1], MOD - 2);
  44. ll tmp1 = ((s[i - 1] * inv % MOD) * dp[i - 1] + a[i - 1]) % MOD;
  45. ll tmp2 = ((s[i - 1] - r[i - 1]) * inv % MOD) * dp[x[i - 1]] % MOD;
  46. ll tmp3 = ((s[i - 1] - r[i - 1]) * inv % MOD) * a[i - 1] % MOD;
  47. dp[i] = ((tmp1 - tmp2) % MOD + tmp3) % MOD;
  48. dp[i] = (dp[i] % MOD + MOD) % MOD;
  49. }
  50. // for(int i = 1; i <= n + 1; i++) printf("%lld\n", dp[i]);
  51. while(q--){
  52. int l, r;
  53. scanf("%d%d", &l, &r);
  54. ll ans = dp[r] - dp[l];
  55. ans = (ans % MOD + MOD) % MOD;
  56. printf("%lld\n", ans);
  57. }
  58. }
  59. return 0;
  60. }

杭电多校HDU 6656 Kejin Player(概率DP)题解的更多相关文章

  1. HDU 6656 Kejin Player (期望DP 逆元)

    2019 杭电多校 7 1011 题目链接:HDU 6656 比赛链接:2019 Multi-University Training Contest 7 Problem Description Cub ...

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

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

  3. HDU 6656 Kejin Player

    hdu题面 Time limit 5000 ms Memory limit 524288 kB OS Windows 解题思路 因为升级只能一级一级地升,所以所求期望满足了区间加的性质,可以一级一级地 ...

  4. hdu多校第七场 1011 (hdu6656) Kejin Player 概率dp

    题意: 一个游戏,有许多关,到下一关要花费金钱,做出尝试,有概率成功,若成功则到达下一关,若失败则停在此关或退回到前面某关,询问第l关到第r关的期望费用 题解: 显然,第r关到第l关的费用是dp[r] ...

  5. 杭电多校HDU 6599 I Love Palindrome String (回文树)题解

    题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\ ...

  6. 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解

    题意: 有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形.棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\). 思路: 由于不构成 ...

  7. 杭电多校HDU 6579 Operation (线性基 区间最大)题解

    题意: 强制在线,求\(LR\)区间最大子集异或和 思路: 求线性基的时候,记录一个\(pos[i]\)表示某个\(d[i]\)是在某个位置更新进入的.如果插入时\(d[i]\)的\(pos[i]\) ...

  8. 杭电多校HDU 6586 String(预处理 + 贪心)题解

    题意: 给你一个串,现需要你给出一个子序列,满足26个约束条件,\(len(A_i) >= L_i\) 且 \(len(A_i) <= R_i\), \(A_i\)为从a到z的26个字母. ...

  9. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

随机推荐

  1. Linux下安装配置rocketmq (单个Master、双Master)

    一.环境: centos7(2台虚拟机):192.168.64.123:192.168.64.125 apache-maven-3.2.5(官网要求maven版本是3.2.x,版本不同,编译rocke ...

  2. Javadoc命令与API

    Javadoc命令与API Javadoc工具会抽取类,成员,方法的文档注释生成与这个类配套的API帮助文档 Javadoc命令和文档注释小公司基本不用,但我们应养成良好的编码习惯,所以还是了解一下 ...

  3. 如何安装快速 Docker 和 Docker-Compose 服务

    最近由于个人在大家基于 Docker  的.企业级的CI/CD 环境,所以要安装 Docker 和 Docker-Compose ,这也算是一个学习过程,就把整个过程记录下来,便于以后查询. 测试环境 ...

  4. 数据库 | 001-MySQL梳理系列(一)

    MySQL基本组成 SQL执行流程 Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数.存储过程.触发器.视图等,其实就是所有跨存 ...

  5. smtplib.py

    def _print_debug(self, *args): if self.debuglevel > 1: print(datetime.datetime.now().time(), *arg ...

  6. 阿里巴巴微服务与配置中心技术实践之道 配置推送 ConfigurationManagement ConfigDrivenAnyting

    阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08 在面向分布式的微服务系统中,如何通过更高效的配置管理方式,帮助微服务系统架构持续"无痛"的演进 ...

  7. Jenkins部署web项目到Tomcat(shell脚本)

    一.首先配置Publish Over SSH插件 配置地址:系统管理-->系统设置-->Publish over SSH(需要安装Publish over SSH插件) 二.jenkins ...

  8. LOJ10144宠物收养所

    HNOI 2004 最近,阿 Q 开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,阿 Q 根据领养者的要求通过他自己发明的 ...

  9. js基础(使用Canvas画图)

    HTML5的元素提供了一组JavaScript API,让我们可以动态地创建图形和图像. 图形是在一个特定的上下文中创建的,而上下文对象目前有两种.第一种是2D上下文,可以执行原始的绘图操作, 比如: ...

  10. cachedThreadPool缓存线程池

    package com.loan.modules.common.util; import java.util.concurrent.BlockingQueue; import java.util.co ...