关于题目中的样例解释翻译如下:
将队伍中的球员编号表示为 的队伍称为队伍 。- 在第 1 场比赛中,球员 1 所属的队伍 和球员 2 所属的队伍 对战,队伍 以 的概率获胜,队伍 以 的概率获胜。然后,这两个队伍合并为一个队伍 。- 在第 2 场比赛中,球员 4 所属的队伍 和球员 3 所属的队伍 对战,队伍 以 的概率获胜,队伍 以 的概率获胜。然后,这两个队伍合并为一个队伍 。- 在第 3 场比赛中,球员 5 所属的队伍 和球员 3 所属的队伍 对战,队伍 以 的概率获胜,队伍 以 的概率获胜。然后,这两个队伍合并为一个队伍 。- 在第 4 场比赛中,球员 1 所属的队伍 和球员 4 所属的队伍 对战,队伍 以 的概率获胜,队伍 以 的概率获胜。然后,这两个队伍合并为一个队伍 。球员 1、2、3、4、5 在整个比赛中,他们所属的队伍获胜的事件发生次数的期望值分别为 ,它们分别为 。
这道题看到就应该想到需要并查集。但是我们需要对于每个人,在他所在的任意时刻的集合的贡献累加到此人身上。发现这样的复杂度不好接受,比如 个人和 个人合并,那样的话复杂度为 ,无法接受。所以需要使用启发式合并,但是这样治标不治本,因为大集合依然要更新答案。这时可以对每个集合记录一个全体累加值,当小的合并过来时,暴力的对小集合中每个元素先加上原先的集合累加量,再加入本次合并产生的,由于本次合并大集合的贡献无效,所以减去(因为大集合的集合全体累加值将会加上本次合并大集合的贡献)。
可以使用 vector
(清空时不可用 clear
,应该用 vector<int>().swap(balabala)
) 或者单链表来进行合并(合并 )。
启发式合并的复杂度为 。
分数的处理逆元可以用 exgcd/qpow
。
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17646506.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步