[CF850F] Rainbow Balls
Posted guessycb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF850F] Rainbow Balls相关的知识,希望对你有一定的参考价值。
题目大意
题解
我们枚举最后剩下的球的种类,那么其他球可以看做没用了。
设选定的球有(a_i)个,球的总数为(s=sum_{i=1}^n a_i)。
现在问题变为:在一个长度为(s)的数轴上,初始在(a_i),问在不到达(0)的前提下到达(s)的期望步数。
设(p_i)表示在(i)点,向前/后移动一步的概率,有:(p_i = frac{i(s-i)}{s(s-1)})。
可以列出一个比较显然的式子:
[f_i = (1-2p_i) f_i + p_i f_{i-1} + p_i f_{i+1} + step_i]
注意(step_i = frac{i}{s}),为什么?
感性理解一下。
想象你有一张很大的图,有一些节点是终止节点。
现在你要从当前节点向某个后继节点走一步,要算到达任意一个终止节点的期望步数。
由于我们现在选定了一个终止节点。
那么假设走到了(0)号点,就相当于走到了去往另一个终止节点的路径。
不妨把这"1"步拆分成若干份,这若干份的和为(1),分开计算。
由于走到(0)就会走到另一条路径上去,所以每一份不妨设为不走到其它路径上的概率。
所以(step_i)为从(i)点出发,不走到(0)的条件下走到(s)的概率。
这是一个经典问题了,很容易得到(step_i = frac{i}{s})。
树上高消肯定是可以的,然而需要求逆复杂度为(O((sum a)logn))无法通过此题。
所以我们需要进一步深入。
带入(step_i = frac{i}{s}),稍微变换后有:
[f_i - f_{i+1} = (f_{i-1}-f_i) +frac{s-1}{s-i}]
所以可以得到:(f_{i}-f_{i+1} = (f_1-f_2) + sum_{j=2}^{i}frac{s-1}{s-j})
那么有:
[f_1 = sum_{i=1}^{s-1} (f_i - f_{i+1}) = (s-1)(f_1-f_2)+sum_{i=2}^{s-1}sum_{j=2}^{i} frac{s-1}{s-j}]
而(sum_{i=2}^{s-1}sum_{j=2}^{i} frac{s-1}{s-j} = sum_{i=2}^{s-1} (s-i) frac{s-1}{s-i} =(s-2)(s-1))。
所以(f_1 = (s-1)(f_1-f_2) + (s-2)(s-1))。
而由于(f_0)属于另一条路径,即不存在,故(f_1 = (1-2p)f_1 +pf_2 + frac{1}{s})。
化简有:(2f_1 = f_2 + 1),所以(f_1 - f_2 = 1 - f_1)。
所以有:
[f_1 = (s-1)(1-f_1) +(s-2)(s-1)]
解得(f_1 = frac{(s-1)^2}{s}),即(f_1-f_2 = 1-frac{(s-1)^2}{s})
而我们知道(f_{i}-f_{i+1})与(f_{i-1}-f_i)之间的关系,所顺次推出所有(f_i)即可。
答案(ans = sum_{i=1}^n f_{a_i}),复杂度(O(max(a)logn))。
以上是关于[CF850F] Rainbow Balls的主要内容,如果未能解决你的问题,请参考以下文章
华为HCIE云计算之Rainbow8.0.0版本迁移windows实战
Dapper学习 - Dapper.Rainbow - Read