概率杂题
P4562 [JXOI2018]游戏
给定区间
首先想到每次将所有点标记的实质,就是将
最后一个关键数的位置...不沾头不沾尾,所以换个方向考虑——最后一个关键数的位置可以替换为它后面的非关键数的数量。
实际上,
于是,最后一个点的位置的期望,即
求所有可能的
取模的话,求完阶乘
P4284 [SHOI2014] 概率充电器
给定一棵树,每条边能导电的概率为
根据期望的线性性,考虑求每个点有电的期望。因为只有
考虑单个点有电的情况:
- 自己有电
- 儿子有电,和儿子连边导电
- 父亲有电,和父亲连边导电
设
- 第一种情况的概率就是
,所以直接𝑞 𝑢 就行。𝑓 𝑢 = 𝑞 𝑢 - 第二种情况非常像树形 DP 的样子,容易想到从叶子节点向上推就行。
- 考虑两个独立事件发生其中一件即可的概率:
,即𝑃 ( 𝐴 + 𝐵 ) = 𝑃 ( 𝐴 ) + ( 1 − 𝑃 ( 𝐴 ) ) 𝑃 ( 𝐵 ) 事件的概率𝐴 + 事件( 𝐵 + 事件未发生𝐴 的概率。) - 进行 dfs,回溯的时候统计:
- 设当前点为
,儿子为𝑢 ,则有𝑣 𝑓 𝑢 = 𝑓 𝑢 + ( 1 − 𝑓 𝑢 ) 𝑝 𝑢 , 𝑣 𝑓 𝑣
- 设当前点为
- 考虑两个独立事件发生其中一件即可的概率:
- 第三种情况实际上也是树形 DP,只不过变成了正推,从
计算对𝑢 的贡献。𝑣 - 假设当前到达
,且𝑢 已经算好了,考虑如何把贡献传给𝑓 𝑢 。𝑓 𝑣 - 容易想到
能贡献给𝑢 电流的那部分概率,实际上是𝑣 扔掉𝑓 𝑢 这棵子树的部分。𝑣 - 换句话说,贡献
= 有电的概率𝑢 − 不考虑𝑢 的有电的概率,再乘边的概率之类的常数即可。𝑣 - 设
,⟨ 𝑢 , 𝑣 ⟩ = 𝑒 不考虑𝑢 的有电的概率为𝑣 ,𝑔 𝑢 只考虑下方来电有电的概率为𝑣 ,有柿子:𝑙 𝑣 𝑓 𝑢 = 𝑔 𝑢 + 𝑙 𝑣 𝑝 𝑒 ( 1 − 𝑔 𝑢 ) 𝑓 𝑢 = 𝑔 𝑢 + 𝑙 𝑣 𝑝 𝑒 − 𝑙 𝑣 𝑝 𝑒 𝑔 𝑢 𝑓 𝑢 − 𝑙 𝑣 𝑝 𝑒 = 𝑔 𝑢 ( 1 − 𝑙 𝑣 𝑝 𝑒 ) 𝑔 𝑢 = 𝑓 𝑢 − 𝑙 𝑣 𝑝 𝑒 1 − 𝑙 𝑣 𝑝 𝑒 𝑓 𝑢 − 𝑔 𝑢 = 𝑓 𝑢 − 𝑓 𝑢 − 𝑙 𝑣 𝑝 𝑒 1 − 𝑙 𝑣 𝑝 𝑒 - 考虑完
有电的贡献,乘一下边的概率和𝑢 没电的概率就行了𝑣 𝑓 𝑣 = 𝑓 𝑣 + ( 1 − 𝑓 𝑣 ) ⋅ 𝑝 𝑒 ⋅ ( 𝑓 𝑢 − 𝑓 𝑢 − 𝑙 𝑣 𝑝 𝑒 1 − 𝑙 𝑣 𝑝 𝑒 )
- 假设当前到达
柿子推完了,写两个 dfs 算答案即可。
SPOJ 4060 KPGAME
CF 1316 F
又是一个重量级题目。
首先我们发现他这个数列是假的,因为求权值的时候是“排序”后再求,子序列也不需要连续,所以我们直接把它当一个数的集合做,不需要维护他们在原数列中的顺序。下面所说的下标都是排序后的下标。
好,接下来考虑一个点对对期望的贡献。
假设有点对
然后来看概率,由于是相邻的,所以能随便挑选的只有
于是得出点对
然后给定一个数列,其权值的期望直接枚举点对计算就是答案:
但是这玩意带单点修改,直接用这个式子的话就是一个非常优秀的
单点修改。考虑分治。
把一个序列分成两段:
的贡献[ 1 , 𝑚 ] 的贡献[ 𝑚 + 1 , 𝑛 ] - 跨越两个区间的点对的贡献
前两个可以分治解决,问题在于第三个东西。
首先这个东西的式子是很好写的:
为了分治,我们得把这个式子拆成左右两半。欸,这
然后我们就可以直接分治解决了。
设一个区间的答案为
对于一个区间
最终答案是
这样的分治,最终复杂度是
这个分治实际上很容易用线段树维护,但是修改权值怎么办?答案是使用权值线段树。
我们将询问离线下来,把原数列和询问中的数字全部离散化,然后存到权值线段树里面,这样显然就把排序的部分做完了。
然后对于每个线段树节点,维护当前区间里面的有效点个数,以及上面那一堆东西,但是
push_up
就用上面的式子就好。
这样的做法时间复杂度为
但是另一个细节的点来了:离散化。由于两个相同的数作为点对也会产生贡献,所以在离散化的时候给他们分配不同的编号。