背包.
考虑对每个人 $i$ ,维护 $p(i,j)$ 表示他剩余了 $j$ 点生命值的概率.
对于一次锁定操作,更新对应的 $p(i)$ 即可.
对于一次结界操作,考虑 $i$ 被命中的概率,需要算出除 $i$ 之外还有 $x$ 个人存活的概率 $q(i,x)$ 来统计答案.
先算出 $q(0,x)$ 表示有 $x$ 个人存活的概率,相当于做了一个背包,要算 $q(i)$ 时,将 $i$ 的贡献从 $q(0)$ 中撤掉即可.
初始生命值 $m_i$ 可以看做与 $n$ 同阶,时间复杂度 $O(qn+n^2C)$ .
1 | //%std |