loj2541 「PKUWC2018」猎人杀

https://loj.ac/problem/2541

自己是有多菜啊,10天前做的题,当时还是看了题解,还让NicoDafaGood同学给我讲了一下。

而我现在忘得一干二净,一点都想不起来了……

主要是当时听懂了就打了,没有总结啊。

我们发现,我们设集合AAww之和是SASA

那么一个集合AA在1之后死的概率是w1SA+w1w1SA+w1

为什么呢。

虽然每次选下一个会死的人,是从没死的人中选,但是实际上,也可以是所有人中选,如果选到了死了的人就继续选。

记得很久以前谁讲过,其实这道题,换一种说法是,

一个序列,有wiwiii,把这一共ww个数随机排列,ii个人死的时候是ii序列里第一次出现的位置。

问第一个人最后死的概率。

或许有点抽象,我们换成数学方式来说:

PiPi是下一个死的是第ii个人的概率

那么Pi=wiwSDPi=wiwSD,其中DD是死了的人的集合。

A=w,B=SDA=w,B=SD

把式子变换一下,我们可以得到Pi=BAPi+wiAPi=BAPi+wiA

就是说有BABA的可能,我们这次做完之后ii还没死,相当于我们攻击到了已死的人。

那么集合AA都在1之后死的概率这样算:

P=i=0(1SA+w1w)iw1w=w1wi=0(1SA+w1w)i=w1w×111+SA+w1w=w1SA+w1P=i=0(1SA+w1w)iw1w=w1wi=0(1SA+w1w)i=w1w×111+SA+w1w=w1SA+w1

接下来我们就需要枚举在1死之后的人的集合的SS,就是ww和,然后容斥。

用分治NTT就可以了。

诶,差点又忘了总结。

主要是,算1是最后死的概率不好算,但是算一个人是在一个集合中最先死的概率好算。

很容易想到容斥一下,然后做背包这玩意可以用NTT,维护一个堆,每次用最小的那两个合并

然后我们发现ww很小,也非常让人舒服。

 

posted @   shixinyi  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
阅读排行:
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】
点击右上角即可分享
微信分享提示