Focus on your|

wscqwq

园龄:2年粉丝:2关注:3

[ABC314F]

A Certain Game

关于题目中的样例解释翻译如下:

将队伍中的球员编号表示为 x1, x2, , xk 的队伍称为队伍 { x1, x2, , xk }。- 在第 1 场比赛中,球员 1 所属的队伍 { 1 } 和球员 2 所属的队伍 { 2 } 对战,队伍 { 1 }12 的概率获胜,队伍 { 2 }12 的概率获胜。然后,这两个队伍合并为一个队伍 { 1, 2 }。- 在第 2 场比赛中,球员 4 所属的队伍 { 4 } 和球员 3 所属的队伍 { 3 } 对战,队伍 { 4 }12 的概率获胜,队伍 { 3 }12 的概率获胜。然后,这两个队伍合并为一个队伍 { 3, 4 }。- 在第 3 场比赛中,球员 5 所属的队伍 { 5 } 和球员 3 所属的队伍 { 3, 4 } 对战,队伍 { 5 }13 的概率获胜,队伍 { 3, 4 }23 的概率获胜。然后,这两个队伍合并为一个队伍 { 3, 4, 5 }。- 在第 4 场比赛中,球员 1 所属的队伍 { 1, 2 } 和球员 4 所属的队伍 { 3, 4, 5 } 对战,队伍 { 1, 2 }25 的概率获胜,队伍 { 3, 4, 5 }35 的概率获胜。然后,这两个队伍合并为一个队伍 { 1, 2, 3, 4, 5 }。球员 1、2、3、4、5 在整个比赛中,他们所属的队伍获胜的事件发生次数的期望值分别为 E1, E2, E3, E4, E5,它们分别为 910, 910, 5330, 5330, 1415

这道题看到就应该想到需要并查集。但是我们需要对于每个人,在他所在的任意时刻的集合的贡献累加到此人身上。发现这样的复杂度不好接受,比如 n 个人和 1 个人合并,那样的话复杂度为 O(N2),无法接受。所以需要使用启发式合并,但是这样治标不治本,因为大集合依然要更新答案。这时可以对每个集合记录一个全体累加值,当小的合并过来时,暴力的对小集合中每个元素先加上原先的集合累加量,再加入本次合并产生的,由于本次合并大集合的贡献无效,所以减去(因为大集合的集合全体累加值将会加上本次合并大集合的贡献)。

可以使用 vector(清空时不可用 clear,应该用 vector<int>().swap(balabala)) 或者单链表来进行合并(合并 O(1))。

启发式合并的复杂度为 O(nlogn)

分数的处理逆元可以用 exgcd/qpow

单链表+exgcd

单链表+qpow

vector+qpow

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17646506.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起