Codeforces 1264C Beautiful Mirrors with queries (概率dp)

守給你的承諾、 提交于 2019-12-09 23:00:22

队里有人问我这题,我就做了一下,然后就ac了

题意

这个人会从1到n这n个镜子(其中记了若干个checkpoint),他依次问孰与城北徐公美,第\(i\)个镜子回答Yes的概率是\(p_i\),No的概率是\(1-p_i\).如果\(i\)回答了Yes,他就会去问\(i+1\),否则返回去问上一个checkpoint那个镜子。求最后问了镜子n且回答了Yes所需的期望次数。

他会做\(Q\)次更新,每次更新会增加或删除一个checkpoint。保证1永远是一个checkpoint。

\(Q,n\leq 2*10^5\).

从概率dp入手:设\(E_i\)为问了前\(i-1\)个镜子,将要问\(i\),距离问完还要的次数的期望。很明显\(E_{n+1}=0\).

显然有递推公式
\[ E_i=p_iE_{i+1}+(1-p_i)E_{c}+1 \]
其中\(c\)是小于等于\(i\)的下标最大的checkpoint。我们把\(n+1\)也看做一个checkpoint。

观察一个checkpoint \(c\),记大于它的最小checkpoint为 \(c'\).


\[ \begin{align} E_{c'-1}&=p_{c'-1}E_{c'}+(1-p_{c'-1})E_c+1\\ E_{c'-2}&=p_{c'-2}E_{c'-1}+(1-p_{c'-2})E_c+1\\ &=p_{c'-2}(p_{c'-1}E_{c'}+(1-p_{c'-1})E_c+1)+(1-p_{c'-2})E_c+1\\ &=p_{c'-1}p_{c'-2}E_{c'}+(1-p_{c'-1}p_{c'-2})E_c+p_{c'-2}+1\\ E_{c'-3}&=...\\ &=p_{c'-1}p_{c'-2}p_{c'-3}E_{c'}+(1-p_{c'-1}p_{c'-2}p_{c'-3})E_c+p_{c'-3}p_{c'-2}+p_{c'-3}+1\\ \end{align} \]
$$

于是可以猜测
\[ E_c=p_cp_{c+1}...p_{c'-1}p_{c'}E_{c'}+(1-p_cp_{c+1}...p_{c'-1})E_c+1+p_c+p_cp_{c+1}+...+p_cp_{c+1}...p_{c'-2} \]
这个用归纳法应该是随便证的,懒得想了()

于是\(E_c=E_{c'}+\frac{1+p_c+p_cp_{c+1}+...+p_cp_{c+1}...p_{c'-2}}{p_cp_{c+1}...p_{c'-1}}\).

不妨设\(f(c,c')=\frac{1+p_c+p_cp_{c+1}+...+p_cp_{c+1}...p_{c'-2}}{p_cp_{c+1}...p_{c'-1}}\),有\(E_{c}-E_{c'}=f(c,c')\).

记checkpoint序列为一个递增序列\(\{c_1,c_2,...,c_m\}\)

因此\(Ans=E_1=E_1-E_{c_1}+E_{c_1}-E_{c_2}+...+E_{c_m}-E_{n+1}=f(1,c_1)+f(c_1,c_2)+...+f(c_m,n+1)\).

\(1\)看成\(c_0\),\(n+1\)看成\(c_{m+1}\).分成两种情况讨论更新:

1.\(c_i\)\(c_{i+1}\)之间插入\(x\).把原来的\(f(c_i,c_{i+1})\)拆成了\(f(c_i,x)\)\(f(x,c_{i+1})\)两段。

2.删除\(c_i\).把原来的\(f(c_{i-1},c_i)\)\(f(c_i,c_{i+1})\)合并成\(f(c_{i-1},c_{i+1})\)一段。

很明显\(f(c,c')\)的求值,对\(p\)打个前缀积,再对前缀积打个前缀和就能\(O(1)\)计算。每次更新时查询小于\(x\)的最大值和大于\(x\)的最小值可以直接丢进set里\(O(log\ m)\)搞。因此\(O(Qlog\ n)\)就能过了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!