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\),简单算一算输出答案