题意

给出排成一列的 \(n\) 个格子,你要从 \(1\) 号格子走到 \(n\) 号格子之后(相当于 \(n+1\) 号格子),一旦你走到 \(i+1\) 号格子,游戏结束。 当你在 \(i\) 号格子时,你有 \(p_i\) 的概率走到 \(i+1\) 号格子,否则你会返回最近的一个 checkpoint (存档点),最近的存档点是指 \(max\{x|x\leq i \; and \; ischeckpoint(x)\}\) 。对于每个 \(query x\) ,会把 \(x\) 号格子的 checkpoint 属性翻转,然后输出此时从 \(1\) 号格子走到 \(n+1\) 号格子的期望步数。

题解

考虑没有 checkpoint 的情况,也就是 2E 的题意。此时有两种比较好的解法:

  1. 设 \(dp_i\) 表示从 \(1\) 号格子开始,第一次走到 \(i\) 号格子所需的期望步数,则 \(dp_1=0\) ,所求为 \(dp_{n+1}\) 。
    对于 \(i+1\) 号格子,走到它有两种可能:成功,从 \(i\) 号格子转移;失败,从 \(1\) 号格子转移。
    \[dp_{i+1}=p_i(1+dp_i)+(1-p_i)(1+dp_i+dp_{i+1})\]

    化简,即
    \[dp_{i+1}=\frac{1}{pi}(1+dp_i)\]

    递推可以求解。

  2. 设 \(dp_i\) 表示从 \(i\) 号格子开始,第一次走到 \(n+1\) 号格子所需的期望步数,则 \(dp_{n+1}=0\) ,所求为 \(dp_{1}\) 。
    对于 \(i\) 号格子,下一步有两种可能:成功,转移到 \(i+1\) 号格子;失败,转移到 \(1\) 号格子。
    \[dp_i=p_i(dp_{i+1}+1)+(1-p_i)(1+dp_1)\]

    则有
    \[dp_{n+1}=0\]
    \[dp_n=p_n(dp_{n+1}+1)+(1-p_n)(1+dp_1)\]
    \[dp_{n-1}=p_{n-1}(dp_n+1)+(1-p_{n-1})(1+dp_1)\]
    \[dp_{n-2}=p_{n-2}(dp_{n-1}+1)+(1-p_{n-2})(1+dp_1)\]
    ...
    \[dp_3=p_3(dp_4+1)+(1-p_3)(1+dp_1)\]
    \[dp_2=p_2(dp_3+1)+(1-p_2)(1+dp_1)\]
    \[dp_1=p_1(dp_2+1)+(1-p_1)(1+dp_1)\]

    每次把上一个式子代到下一个式子,会使得整个式子只带有 \(dp_1\) 一个未知项,最后把 \(dp_1\) 解出来就可以了。

那么加上 checkpoint ,解法出现了一些变化,只说看起来比较好的第一种。

设 \(dp_i\) 表示从 \(1\) 号格子开始,第一次走到 \(i\) 号格子所需的期望步数,则 \(dp_1=0\) ,所求为 \(dp_{n+1}\) 。
对于 \(i+1\) 号格子,走到它有两种可能:成功,从 \(i\) 号格子转移;失败,从 \(x\) 号格子转移, \(x\) 表示 \(i\) 对应的 checkpoint。
根据期望的线性性,可得 \(cost(x,y)=dp_y-dp_x\) ,表示从 \(x\) 号格子转移到 \(y\) 号格子的花费为两式的差。
\[dp_{i+1}=p_i(1+dp_i)+(1-p_i)(1+dp_i+cost(x,i+1))\]

化简,即
\[dp_{i+1}=\frac{1}{p_i}(1+dp_i-(1-p_i)dp_{x})\]
\[dp_{i+1}=\frac{1}{p_i}(1+dp_i+(p_i-1)dp_{x})\]
\[dp_{i+1}=\frac{1}{p_i}+dp_{x}+\frac{1}{p_i}dp_i-\frac{1}{p_i}dp_{x}\]

注意到一开始是没有任何 checkpoint 的(就算有也可以逐个添加进来),先按照 2E 的方法解决好。然后插入第一个 checkpoint \(x\) ,那么显然不比 \(x\) 大的都是不受影响的。
第一个受影响的点即 \(x+1\) :
\[dp_{x+1}=\frac{1}{p_x}(1+dp_x-(1-p_x)dp_{x})\]

化简,即
\[dp_{x+1}=\frac{1}{p_x}+dp_{x}\]

第二个受影响的点即 \(x+2\) (第一种化简格式):
\[dp_{x+2}=\frac{1}{p_{x+1}}(1+dp_{x+1}-(1-p_{x+1})dp_{x})\]

代入,即
\[dp_{x+2}=\frac{1}{p_{x+1}}(1+\frac{1}{p_x}+dp_{x}-(1-p_{x+1})dp_{x})\]

化简,即
\[dp_{x+2}=\frac{1}{p_{x+1}}(1+\frac{1}{p_x}+p_{x+1}dp_{x})\]

化简,即
\[dp_{x+2}=\frac{1}{p_{x+1}}+\frac{1}{p_x p_{x+1}}+dp_{x}\]

代入第三种化简格式,检验成立

第三个受影响的点即 \(x+3\) (第三种化简格式):
\[dp_{x+3}=\frac{1}{p_{x+2}}+dp_{x}+\frac{1}{p_{x+2}}dp_{x+2}-\frac{1}{p_{x+2}}dp_{x}\]

代入,即
\[dp_{x+3}=\frac{1}{p_{x+2}}+dp_{x}+\frac{1}{p_{x+2}}(\frac{1}{p_{x+1}}+\frac{1}{p_x p_{x+1}}+dp_{x})-\frac{1}{p_{x+2}}dp_{x}\]

化简,即
\[dp_{x+3}=\frac{1}{p_{x+2}}+\frac{1}{p_{x+1} p_{x+2}}+\frac{1}{p_x p_{x+1} p_{x+2}}+dp_{x}\]

假设保存有 \(p_i\) 的逆元 \(invp_i\) ,那么这个修改就相当于每个元素依次加上一个前缀积。

Codeforces Round #604 (Div. 1) - 1C - Beautiful Mirrors with queries的更多相关文章

  1. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors

    链接: https://codeforces.com/contest/1265/problem/E 题意: Creatnx has n mirrors, numbered from 1 to n. E ...

  2. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学

    题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...

  3. Codeforces Round #604 (Div. 2) D. Beautiful Sequence(构造)

    链接: https://codeforces.com/contest/1265/problem/D 题意: An integer sequence is called beautiful if the ...

  4. Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest

    链接: https://codeforces.com/contest/1265/problem/C 题意: So the Beautiful Regional Contest (BeRC) has c ...

  5. Codeforces Round #604 (Div. 2) B. Beautiful Numbers

    链接: https://codeforces.com/contest/1265/problem/B 题意: You are given a permutation p=[p1,p2,-,pn] of ...

  6. Codeforces Round #604 (Div. 2) A. Beautiful String

    链接: https://codeforces.com/contest/1265/problem/A 题意: A string is called beautiful if no two consecu ...

  7. Codeforces Round #604 (Div. 2) A. Beautiful String(贪心)

    题目链接:https://codeforces.com/contest/1265/problem/A 题意 给出一个由 a, b, c, ? 组成的字符串,将 ? 替换为 a, b, c 中的一个字母 ...

  8. Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)

    题目链接:https://codeforces.com/contest/1265/problem/B 题意 给出大小为 $n$ 的一个排列,问对于每个 $i(1 \le i \le n)$,原排列中是 ...

  9. Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest(贪心)

    题目链接:https://codeforces.com/contest/1265/problem/C 题意 从大到小给出 $n$ 只队伍的过题数,要颁发 $g$ 枚金牌,$s$ 枚银牌,$b$ 枚铜牌 ...

随机推荐

  1. wstngfw中使用虚拟IP映射内网IP

    wstngfw中使用虚拟IP映射内网IP -------------------------------- Server01: IP: 192.168.195.73/24 GW: 192.168.19 ...

  2. Centos7安装防火墙firewall

    安装 1.下载 yum install -y firewalld yum install -y firewall-config 2.启动 systemctl start firewalld # 启动 ...

  3. 实现Feign请求拦截器,对请求header等参数进行转发

    参考:Feign传递请求头信息(Finchley版本) 问题:通过Feign远程调用服务,无法传递header参数. 解决方式:实现RequestInterceptor接口(对所有的Feign请求进行 ...

  4. springboot2.1.3使用jdbcTemplate

    这里只是备忘一下使用方式,至于配置数据源信息不在此文中讲解,忘谅解. 1.  查询返回List<Long>数据集 (这里比如返回userId,long型) @Autowired@Quali ...

  5. Flask统计代码行数

    流程: 1.获取前端的文件 2.判断文件是否zip文件 3.解压压缩包并保存 4.遍历解压后的文件夹 5.判断文件是否py文件,将绝对路径添加到列表 6.循环列表,排除注释和空号,统计行数 from ...

  6. k8s 如何支持私有镜像

    k8s如何支持私有镜像 实现无密钥编排 kubectl create secret docker-registry regsecret --docker-server=registry.cn-shen ...

  7. jquey动画效果

    jquery的事件没有on,js的有. 1.show()  显示  由小变大缓慢显示 <html lang="en"> <head> <meta ch ...

  8. jqGrid行编辑配置,方法,事件

    行编辑可以在行修改后更新数据,如下图所示 用户用鼠标点击选择一行,jqGrid将可编辑的字段转换为数据输入单元,如上面图所示.不可编辑的列,如id,不会转为可输入单元,而是保持不变.可以通过配置col ...

  9. 剑指Offer(二十三):二叉搜索树的后序遍历序列

    剑指Offer(二十三):二叉搜索树的后序遍历序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  10. Java获取视频的大小、时长

    前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...