题意

给出排成一列的 \(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. python3-使用requests模拟登录网易云音乐

    # -*- coding: utf-8 -*- from Crypto.Cipher import AES import base64 import random import codecs impo ...

  2. Node.js学习之(第三章:简易小demo)

    前言 我们前面已经学习完了Node中一些核心模块还有如何正确配置响应头的Content-Type,今天我们来实现一个简单的demo,巩固下之前学习的内容. 需求 我们平时访问百度或者其他大的门户网站的 ...

  3. iOS进阶之多线程--NSThread详解

    NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期.在平时使用很少,最常用到的无非就是 [NSThread cu ...

  4. ceph维护命令小结(基于jewel版)

    ceph osd pool 操作小计 #列出所有pool root@ceph:~# ceph osd pool ls [detail] #新建pool root@ceph:~# ceph osd po ...

  5. Python_模块的定义与使用

    1.模块的定义: 1.1 标准格式: import 模块名 模块名.函数名(实参列表) 1.2 特殊格式: from 模块名 import 函数名1,函数名2... 函数名(实参列表) 2.模块的使用 ...

  6. 运维开发笔记整理-django日志配置

    运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...

  7. onvirt安装linux系统

    情况说明: (1)本文接前文kvm虚拟化学习笔记(十九)之convirt集中管理平台搭建,采用convirt虚拟化平台安装linux操作系统的过程,这个过程中需要对convirt进行一系列的配置才能真 ...

  8. ISCC之msc1(签到题)

    V2VsbCBkb25lIQoKIEZsYWc6IElTQ0N7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K Flag: ISCC{N0_0ne_can_st0p_y0u} 签到题 八进制 ...

  9. 《你们都是魔鬼吗》团队作业Beta冲刺---第一天

    团队作业Beta冲刺 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 (1)掌握软件黑盒测试技术:(2)学会编制软件 ...

  10. KVM虚拟机,如何设置虚拟机的CPU型号与物理机是一样的

    1.在kvm主机上修改配置文件 [root@node160 ~]# virsh edit CentOS-7.3-X86_64 将xml配置文件中的: <cpu mode='custom' mat ...