P4457 【[BJOI2018]治疗之雨】

tag:概率期望,dp,推柿子

5568 -- 【BJOI2018】治疗之雨

一道思路很像的题【SHOI2017】分手是祝愿

题面翻译

你有\(p\)滴血,满血\(n\)滴,进行很多个回合:

  • 先是\(\frac 1{m+1}\)的概率增加\(1\)血,已经满血则概率为\(0\)
  • 然后是\(k\)次判定,每次判定\(\frac 1{m+1}\)的概率减少\(1\)血,已经死了则概率为\(0\)

问期望几个回合没血(第\(ans\)个回合没完就死了算第\(ans\)个回合)

初步推导

考虑期望\(dp\),设\(f[x]\)表示\(x\)滴血,期望几回合没血

状态转移很显然,先枚举有没有加血,再枚举剩几滴血

\(f[x]=\frac 1{m+1}\sum_{i=0}^{x+1}f_ip_{x+1-i}+\frac m{m+1}\sum_{i=0}^xf_ip_{x-i}+1\)\(p_i\)表示扣\(i\)滴血的概率)

\(f[0]=0\)(边界)

这里有个细节,由于只有\(k\)次判定,所以可能扣不了那么多血,所以把\(i>k\)\(p_i\)都设成0就好了

推导\(p_i\),相当于是\(k\)次判定中,有\(i\)次中了,\(k-i\)次没中,再乘上\(\binom ki\)

得到\(p_i=\frac {m^{k-i}}{(m+1)^k}\cdot\binom ki\)

这道题虽然判定次数多达\(1e9\),但是扣血上限只有\(n\),1500级别

所以只预处理前\(n\)个即可,用递推式预处理\(p_i=p_{i-1}\cdot\frac{k-i+1}i\cdot\frac 1m\)

这里有个问题,思考一下。
当你只有\(x\)滴血的时候,\(p_x\)还是那么多吗?
注意到如果你中途没有血了,那么后面判定是必定不中的(题面写的),所以这个时候\(p_x\)就不是那个表达式了。
但是这并没有关系,为什么?
\(x\)滴血扣\(x\)滴,就是0了,而\(f_0=0\),就是说你不管它系数多少都没影响,乘出来都是0

然后方程的系数就预处理好了,得到了\(O(n^3)\)的高斯消元做法

玄学推式子

做不出来题没事儿干展开了一下前几个表达式

\(f_1=\frac 1{m+1}(f_2p_0+f_1p_1+f_0p_2)+\frac m{m+1}(f_1p_0+f_0p_1)+1\)

注意到\(f_0\)贡献为\(0\),后面就都不考虑它

发现这个式子可以化简成\(f_1=k_1f_2+b_1\)的形式

再看\(f_2\),发现\(f_2\)只和\(f_1,f_2,f_3\)有关,这个时候把\(f_1\)代换成\(k_1f_2+b_1\)

于是\(f_2\)就只和\(f_3\)有关了,也可以表示成\(f_2=k_2f_3+b_2\)

然后带回得到\(f_1=k_1f_2+b_1=(k_1k_2)f_3+(k_1b_2+b_1)\)

于是在推\(f_4\)的时候,又可以把\(f_1,f_2\)都代换成\(f_3\)的式子,那么\(f_3\)就只和\(f_4\)有关了

然后就得到了一个算法:

  • 对于\(f_n\),把\(f_1,f_2\cdots f_{n-1}\)都分别代换成\(k_if_n+b_i\)

  • 求出\(f_n=k_nf_{n+1}+b_n\)

  • \(f_n\)代回,求出\(f_i=k'_if_{n+1}+b'_i\)

进行到\(f_n\)的时候,由于题面,这时必定不会加血,那么有

\(f_n=\sum_{i=0}^nf_ip_{n-i}+1\),这个时候把后面的\(f_i\)全部代换,就很容易地求出\(f_n\)

于是\(f_p=k_pf_n+b_p\)即可

复杂度\(O(n^2)\)

喜提50

特判特判特判

重要的事说三遍

  • \(k=0\)直接\(-1\)

  • \(m=0\)

    这个时候加血和减血都是必中

    • \(k=1\),则每回合血量+1-1,一直下去(直接\(-1\)
    • \(k>1\),每回合必扣\(1-k\),简单算一算输出答案
posted @ 2021-07-01 15:29  oisdoaiu  阅读(41)  评论(0编辑  收藏  举报