【JZOJ】4212 我想大声告诉你

Description

这个游戏有 n 个人参加,每一轮随机选出一个还没有出局的人x,接着 x 会出局。x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有 p 的概率被淘汰。(注意遭到攻击淘汰的人是不能攻击剩下的人的)
在所有人都出局或淘汰之后,游戏结束。现在某人想要知道对于每一个0kn1,自己恰好在遭受 k 次攻击之后出局的概率是多少。
所有数值的运算在模258280327 的意义下进行。

Tips

请注意淘汰和出局的区别。
淘汰是不计入最终答案的。
原题完全没有说清楚。

Brute Force

对于60% 的数据,n100
对于100% 的数据, n2103 1T5 0x<y109

所以暴力也挺难想的。
考试时想出来了题意不清楚导致样例都过不了我就不吐槽了。

设状态 F[i][k] 为我活到剩下 i 个人,每个人都被攻击了k次的概率是多少。
假如我这轮死了(概率为 1i ),答案 k 就可以加上当前概率乘以1i了。【然后我可以不管了反正我出局了】
如果我没死,是其他的某个人死了。这就有可能会造成更多的伤亡。
假设有 j 个人因为攻击被淘汰了。
首先我是绝对不能成为淘汰或出局的人中的任何一个的。(i1ji
接着 i1 个人里面选出 j 个人一共有很多种可能。(Cji1
要造成只死 j 个人是有一定难度的。((1p)i1jpj
把这些都和当前 F[i][k] 乘起来就可以累加到 F[i1j][k]

这是 O(n3)

Analysis

我们转化一下问题。
我们把每个人出局或者淘汰的次序看成一个 1 to n 的排列。
这样我们可以得出所有人的出局或者淘汰顺序。
我们设 F[i][k] 表示当前做到第 i 个位置,此时i+1n都受到了 k 次攻击的概率。
我们这个人到底是淘汰出去的呢还是正常出局的呢?
假如我们是是正常出局的,我的出局会对后面造成1次攻击,前提是我在承受k1次攻击之后活了下来,正常出局。

F[i][k]+=F[i1][k1](1p)k1

假如我们是被淘汰的,我的淘汰并不会对后面的人有影响,我不会造成攻击然后默默地死去= =,这就是我在这 k 次攻击中没能顺利活下来所付出的代价。
F[i][k]+=F[i1][k](1(1p)k)

那我们的答案 k 就是1nn1i=0F[i][k](1p)k,表示我在 i 位置被正常出局的概率。
1n是因为我有 1n 的几率站在这个排列中的某个确定的位置【就是位置 i 啦】

初始F[0][0]=1

这样就是 O(n2)

Summary

我们要巧妙地利用概率的互不相干性,可以分别累加、相乘。
在处理复杂问题时,我们不一定要细分每一个状态,一个状态可能有多种可能,累加的时候分别讨论即可。
我们可以跳过中间的状态讨论,得出最后我们到底需要什么。从而精简状态,简化转移。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值