概率期望
概率期望
这是一个挺大的东西,又涉及到dp,又涉及到数学,就不知道咋分类
同时,这也是我最菜的几部分之一
符号 & 定义 & 基础知识
符号&定义
概率
\(P(A)\) 表示事件 \(A\) 发生的概率。
- 对于离散的情况,假设一共有 \(n\) 种情况均匀随机,其中 \(m\) 种使得事件 \(A\) 成立,那么 \(P(A)=\dfrac{m}{n}\)
因此,“概率”在很多情况下可以看作“计数”
当然,直接考虑概率也有好处,它相当于约掉了很多东西,让问题处理起来更加方便
- 对于连续情况:可以使用面积/体积的比来计算概率
\(P(A|B)\) 表示条件概率,即,我们假设 \(B\) 已经发生的条件下,\(A\) 多少概率发生。
这里 \(B\) 相当于一个大前提,就是说,假设 \(B\) 的条件 已经 被满足了,\(A\) 多少概率发生。
\(P(A|B)=\dfrac{P(A\cap B)}{P(B)}\)
期望
对于随机变量 \(x\),\(E(x)\) 表示 \(x\) 的期望。
-
对于离散的情况,它的值就是每一种可能值乘以它对应的概率
如,扔一个标准的骰子,朝上的点数的期望是 \(1\times\dfrac{1}{6}+2\times\dfrac{1}{6}...+6\times\dfrac{1}{6}=3.5\)
此时也可以认为它的值是:所有方案的和/总方案数
-
对于连续的情况,我们可以使用积分等手段计算期望,这里略
基础知识
注意:以下式子全都可以反过来用,做题的时候思维要灵活一些
概率
当 \(A,B\) 独立(即二者互不影响)时:
- \(P(A\cap B)=P(A)\times P(B)\)
- \(P(A\cup B)=P(A)+P(B)\)
设 \(\overline{A}\) 表示 “\(A\) 不发生”,则 \(P(\overline{A})=1-P(A)\)
这个式子结合上面两个式子,可以使用容斥原理计算概率
\(P(A|B)=\dfrac{P(A\cap B)}{P(B)}\) (条件概率)
若 \(A_1,A_2...A_n\) 恰好能覆盖所有情况(即,完备),对于事件 \(B\),\(P(B)=\sum\limits_{i=1}^{n} P(B|A_i)\times P(A_i)\)
这个相当于是一个分类讨论,先按 \(A\) 分类,看 \(B\) 在这个条件下多少概率出现
就好比我家里有短裙和短袖,每种红绿蓝三种颜色的各一件,即,一共 \(6\) 件衣服
那我穿红色衣服的概率就是,穿红色短袖的概率+穿红色短裙的概率
期望
当 \(x,y\) 独立时,\(E(x+y)=E(x)+E(y)\) (期望的线性性)
这个式子有一个等价的表达,\(E(ax+by)=aE(x)+bE(y)\),其中 \(a,b\) 是任意标量
它在实际使用的时候,可以考虑拆成贡献的形式,然后对于每一个贡献独立,就线性,然后加起来。
比如说逆序对数,可以看成是每有一个 \((i,j)\ :\ i<j,a_i>a_j\) 就贡献一次,然后就可以把逆序对拆成每个这样的贡献的和,然后和的期望=期望的和,变成 \(\sum\limits_{i<j} P(a_i>a_j)\)。
此时,\(E(xy)=E(x)E(y)\) 同样成立。
对于证明,就把一个数写成值乘概率加起来的形式,然后代入进去发现两边一样就证完了。
当 \(x\) 是正整数时,\(E(x)=\sum\limits_{i} P(x\ge i)\)
证明就考虑一下一个 \(P(i)\) 被算多少次就行了,算一算发现这个次数正好是 \(1,2,3...n\)
而对于正整数的情况,期望正好是 \(\sum\limits_{i} i\times P(i)\),\(P(i)\) 应该被算 \(1,2,3...n\) 次,正好一样,就对了
对于一个命题 \(p\),\(E([p])=P(p)\)。换句话说,\([p]\) 的真假性,就是 \(p\) 为真的概率。很明显对吧
概率的期望
这个东西也是有意义的。
结合实际问题具体的讲,就是:现在我们想要求某个事件 \(A\) 发生的概率 \(P\),有 \(n\) 种可能的情况会发生,第 \(i\) 种情况里面发生 \(A\) 的概率是 \(P_i\)。每种情况还有一个发生的概率,设为 \(Q_i\)。相当于是两层随机,先随机一种情况,一种情况里面是否发生 \(A\) 又是随机的。
此时 \(A\) 发生的概率,可以用全概率公式考虑,就是 \(\sum\limits_{i=1}^{n} Q_i\times P_i\)。而如果我们以事件为研究对象,那这个东西就等于 \(E(P)\),也就是 \(P\) 的期望。
例题&思维方法 I
这是第一部分,暂且比较简单
(因为这块参考的课件是比较早的课件,好像是noip的集训)
poj2151 简单题
有两个限制:每个队都得做至少一个题(设为条件A),并且至少存在一个队做出来 \(k\) 个题 (设为条件B)
我们要求 \(A\cap B\) 的概率。众所周知,\(P(A\cap B)=P(A)-P(A\cap\overline{B})\)
为什么这么考虑呢,因为,正难则反嘛。
先看 \(P(A)\) 怎么做。简单想一下,也得考虑反面做。对于每个队,考虑拿 \(1\) 减去爆零的概率,就是这一个队至少A掉一个题的概率。然后由乘法原理,队之间的概率乘起来,就是同时满足的方案。
接下来看 \(P(A\cap \overline{B})\)。考虑 \(\overline{B}\) :每个队A掉的题数都 \(\le k-1\)。由于还需要满足条件 \(A\),所以相当于每个队A掉的题都在 \([1,k-1]\) 里面。
考虑这个咋做。此时熟练的选手脑子里已经有一个GF了。先枚举队,设 \(f(i)\) 表示这个队AC了 \(i\) 个题的方案数。那肯定是,在概率数组里选 \(i\) 个“AC的概率”乘起来,然后选 \(m-i\) 个 “不AC的概率” 乘起来。我们发现这很GF,直接GF
设当前这个队AC第 \(i\) 个题的概率是 \(p_i\)。那很明显 \(f\) 的OGF,设为 \(F\),就是
最后得到当前这个队的答案就是 \(F[x^1...x^{k-1}]\)。每个队的答案乘起来就行了。
朴素的实现是 \(O(nm^2)\) 的。使用分治FFT可以做到 \(O(nm\log m)\),这里略(毕竟是10级算法)
这题非常水,但是可以帮助理解概率的“考虑反面”思想,还有条件之间取交,取并的概率的计算。这些是很重要的基础知识,做完这个题之后也可以想一想。
CF601C Kleofáš and the n-thlon
(神秘名字,谁教教我咋念啊)
题目中,\(k\) 这个人在 \(i\) 比赛里面的排名被设为 \(x_i\)。但由于后面要用 \(x\) ,这里取名叫 \(p_i\)。
设 \(s_i\) 表示第 \(i\) 个人的总得分
我们要求 \(k\) 这个人的排名(定义为小于它的数量+1)的期望。
根据上面期望相关的式子,先转化一波。要求:
注意到对于某人的某次比赛,排第几名都是等概率的。又注意到除了 \(k\) 这个人之外的人,没有本质区别,都可以看做是同一个人,或者说,把两个人换一下完全不影响。感性理解叫 “都是外人”
根据线性性把这个式子拆开,然后根据人之间的等价性,每一项都是一样的。于是变为:
\(i\) 任意。我们后面就称它为“外人”,即,一个不是 \(k\) 的人。
对于 \(i\) 这个人,在第 \(j\) 场比赛里面,排 \(r\) 位的概率都是 \(\dfrac{1}{m-1}\),但是 \(r\) 不能是 \(p_j\)。
那它在这一场比赛里,所有可能性构成的OGF就是 \(\sum\limits_{i=1}^{m}[i\neq r]\dfrac{1}{m-1} x^i\)
我们把每一场比赛的这个 OGF 卷一下,\(i\) 次方项就是它总得分为 \(i\) 的方案数。取它的 \([1,s_k)\) 次项和即可。
但是就算拿FFT卷,朴素的复杂度也是 \(O(n^2m\log(nm))\),不太能过。拿分治FFT写似乎理论复杂度对了,毛估估应该是 \(O(nm\log (nm))\) 的。但是我觉得它应该会很难写,也不应该是标程。这题的这个范围似乎在提示我们,复杂度应该是 \(O(n^2m)\)
考虑这一堆GF,它们只有一个空缺,和全 \(1\) 的多项式非常像。
考虑差分。由于它是两段 \(1\) 组成,所以它的差分应该最多 \(4\) 个位置有值。而多项式这个系数取差分,其实就是卷上一个 \(1-x\),性质非常好:满足交换律和结合律。也就是说,我们可以先取一堆差分,然后再卷,然后再前缀和做回来,做的顺序不影响。
那这样只有 \(4\) 个位置有值,就算是暴力的从 \(1\) 到 \(n\) 枚举,每次卷积的复杂度也只有 \(O(4nm)=O(nm)\),总复杂度 \(O(n^2m)\)。虽然劣一些,但是好写
CF712E Memory and Casinos
(暂时是这篇最难的题)
我们发现题目相当于要我们求区间 \([l,r]\),从 \(l\) 点开始走,一出区间就停止,从区间右边出来的概率。
我们发现它好像有着像链表一样的,能够 接起来 的性质。对于区间 \([l,p],[p+1,r]\),我们从 \(l\) 开始,从 \(p\) 右边出来,就会进入 \([p+1,r]\) 区间,然后我们再利用这个区间的信息,就可以求出从 \(r\) 右边出来的概率。
敏感的同学可能会想到线段树的区间拼接
对!太对了!非常好!
然而,实际情况要复杂一些,因为我们还能跑到下一个区间再回来,再跑过去,再回来...不过能够想象出来这应该是一个等比无穷求和,毕竟这个概率肯定是一个具体的数,那怎么也得收敛对吧。
我们尝试写一写。对于一个区间,记 \(P\) 表示从 \(l\) 开始,一出区间就停止,从区间右边出来的概率。
假设现在我们要把区间接起来。设有两个区间 \([l_1,r_1],[l_2,r_2]\),编号 \(1,2\),相邻(即 \(r_1+1=l_2\))。
我们写一写,诶,回来那一部分如何表示?从下一个区间回来,概率可以从反面考虑,是 \(1-P_2\)。但是从 \(1\) 又回到 \(2\),相当于是:从 \(r\) 开始从右边出来的概率。
同样考虑反面,我们需要维护的就是,从 \(r\) 开始从左边出来的概率。设这个概率是 \(Q\)。
先考虑 \(P\) 如何做:最naive的就是 \(P_1P_2\),但光有这一项还不够,还有 \(P_1P_2\times [(1-P_2)(1-Q_1)]^k\)。那个 \(^k\) 表示我们可以任意的过去,回来,过去,回来...这样绕圈。
根据这个,有:
一看,果然是个等比无穷求和。啪的一下写出,(\(Q\) 那个是同理出来的)
然后我们可以用线段树维护这样的合并。
PS:我准备写另一篇blog,着重于讲这种维护区间出入的线段树。
例题&思维方法 II
CF1540B Tree Array
首先是一波线性性,变成:枚举点 \(a<b\),\(b\) 在 \(a\) 前面涂色的概率之和
第一个染色的点,显然有着本质的区别,这一步枚举不可避。枚举第一个染的点,令它为根,记为 \(r\)。
设 \(a,b\) 的 LCA 是 \(L\)。那染到 \(a,b\) 两点,肯定得先染到 \(L\) 点,然后有两条分叉,一条冲着 \(a\) 过去,一条冲着 \(b\) 过去。记两个长度为 \(l_a,l_b\)。
接下来咋搞呢?不会整,重新读一遍题,发现扩展出去每个点都是等概率的,于是,往 \(a\) 方向和往 \(b\) 方向走,概率相同。如果我们只考虑 \(a,b\) 两条路径,不分叉到别的东西,那可以认为,走任意一边的概率都是 \(1/2\)
我们发现这个问题和 \(a,b,L\) 已经无关,只和 \(l_a,l_b\) 有关。不妨预处理出 \(f(x,y)\) 表示一条路长 \(x\) 一条路长 \(y\),\(x\) 那一条先被染完,的概率。
容易推出边界:\(f(x,0)=0,f(0,y)=1\);转移:\(f(x,y)=\dfrac{1}{2}(f(x-1,y)+f(x,y-1))\)
预处理出这个,枚举 \(a,b,r\),加一加,\(O(n^3)\)
关于如何去除LCA的那个log:可以预处理出
LCA[r][x][y]
表示以 \(r\) 为根,\(x,y\) 两点的LCA。这个显然可以 \(O(1)\) 的推,于是 \(\log\) 就被非常暴力的去掉了
agc028B Removing Blocks
在 笛卡尔树 那一篇学术垃圾里有讲
如果我们把目光放在期望与概率上(而不是笛卡尔树),我们注意到这个式子
\(E(dep_i)=\sum\limits_{j} P(j\in anc(i))\),\(anc(u)\) 表示 \(u\) 的祖先。
这个其实也是期望的线性性的转化。由此可见,期望线性性这一条性质看起来简单,实际用起来是非常灵活的。
题
相传是 E.Space 出的题
有一颗treap,\(n\) 个点权值均匀随机,求每个点深度的期望,输出小数,保留7位
由上一个题的结论,就两个调和加一下就行。调和级数在 \(n\) 比较大的时候可以用 \(n\ln n+\epsilon\) 逼近。
CF605E Intergalaxy Trips
设 \(E(x)\) 表示 \(x\) 到 \(n\) 的期望距离
一般都会设成“某个点到终点的期望xxx”,因为这样的好处是,我们可以知道终点的期望值是 \(0\),而且也方便递推
为啥不设起点呢?这里倒是可以,但是有的题里面我们完全可能绕一圈回到起点然后继续走,但是到终点是设定上就要停的
脑子里转两圈想想发现,对于一个点,出现了若干条边,我们肯定选 \(E\) 最小的那个点过去,假设我们真的能够知道过去的这个点 \(E\) 是多少。
那我们怎么知道呢?(ssh队长的代码从而直接知道这个值)
继续想一想,我们跑到的点的 \(E\),肯定比当前点的 \(E\) 小。那对于 \(E\) 超过当前点的,直接不看。也就是说,我们从小到大看所有点的 \(E\) 值。
问题又来了,我不知道它们的 \(E\),我怎么“从小到大”?
注意到 \(E(n)=0\),显然是最小的,是已知量。我们可以从这个最小值开始扩展,每次找没扩展的点的最小值,那它肯定是第二小;再找,肯定是第三小...相当于一个动态的计算过程,和dijkstra非常像。
每次找一个新点的时候,已经扩展的点的信息都算好了,假设有 \(k\) 个。我们可以把它们按 \(E\) 值从小到大排序。为表达方便,直接把它们编号 \(1\cdots k\)。那么,
注:
那个 \(+1\) 不用多讲,就是多走一步
前面一半的 \(i\) 是枚举能到的点中 \(E\) 最小的点是 \(i\)。既然这样,肯定是 \(u\) 到 \(i\) 有边,且 \(u\) 到 \(i\) 前面的点没有边,这时候 \(i\) 才恰好能成为最小值。然后它所用的步数期望就是 \(E(i)\)
后面一半是最拉的情况:所有边都没有,只能原地tp,还要花 \(1\) 的代价。
这样转移一波就行了。复杂度 \(O(n^2)\),解决 \(n,m\le 1000\) 的问题。
如果使用堆优化,可以做 \(n,m\le 10^6\),复杂度 \(O(m\log n)\),和dij一个复杂度。
wf2018 Gem Island
我们要求最后排名前 \(r\) 大的宝石数的和的期望。这里做一个小转化,我们考虑新增(即,分裂出来)了多少,求出这个之后答案加上 \(r\) 即可。设第 \(i\) 个人的宝石分裂了 \(a_i\) 次,我们要求 \(a\) 数组前 \(r\) 大的和的期望(\(+r\))
对于每个 \(a_i\),我们把它想象成是一个柱状图。那我们要求前 \(r\) 高的柱子的高度和。
根据 这个trick,我们考虑这个按列求和,换成是按行求和
我们枚举行(即,枚举值) \(x\),然后看有多少个 \(a_i\ge x\),假设有 \(c\) 个。如果 \(c\le r\),那无疑,这 \(c\) 个数一定被包含在最高的那 \(r\) 个数里面,贡献直接 \(+c\)。然而,如果 \(c>r\),那么我们只能取前 \(r\) 高的柱子去贡献。哪些柱子是前 \(r\) 高的?我们无法确定,但也不用确定,因为我们可以肯定它对答案的贡献一定是 \(+r\)。
即,我们设 \(c_x\) 表示 \(\ge x\) 的有多少个。那么对于一种确定的 \(a_i\),答案为 \(\sum\limits_{i=1}^{\infin} \min(c_x,r)\)
以上是一种比较具体的考虑方法。接下来是比较抽象的。
设前 \(r\) 大的数为 \(a_{p_1},a_{p_2}...a_{p_r}\)。则我们要求:
\[E\left(\sum\limits_{i=1}^{r} a_{p_i}\right)=\sum\limits_{i=1}^{r} E(a_{p_i})\\ =\sum\limits_{i=1}^{r} \sum\limits_{x=1}^{\infin} P(a_{p_i}\ge x)\\ =\sum\limits_{i=1}^{r} \sum\limits_{x=1}^{\infin} E([a_{p_i}\ge x])\\ =\sum\limits_{x=1}^{\infin} E(\sum\limits_{i=1}^{r} [a_{p_i}\ge x]) \]对于 \(x\),设 \(c_x\) 表示 \(a\) 里面有多少个 \(\ge x\)。由于我们只考虑前 \(r\) 大的,所以对于每个 \(c\) 我们还要把它和 \(r\) 取个 \(\min\)。
那我们相当于求 \(E\left(\sum\limits_{x=1}^{\infin} \min(c_x,r)\right)\)。
设式子 \(F=\sum\limits_{x=1}^{\infin} \min(c_x,r)\)。由上面期望的变形之一,我们考虑求所有情况下 \(F\) 的和,除以情况数。
考虑:决定 \(c\) 因素是啥?那当然是由 \(a\) 决定。那 \(a\) 满足什么条件呢?注意到,总共分裂的次数是 \(d\),确定的。那么 \(a\) 的和为 \(d\)。那么我们的问题是,一堆数的和为 \(d\),我们要算,所有可能性的 \(F\) 的和。
于是,我们设 \(f(i,j)\) 表示 \(i\) 个数和为 \(j\),\(F\) 的和。还是依着那个具体的考虑方法,我们每次切掉最下面一行,看看会如何。能够切掉一行,那得 \(\ge 1\)。于是我们枚举 \(i'\),表示当前选的 \(i\) 个数里面有 \(i'\) 个 \(\ge 1\) 的。然后我们看这些 \(\ge 1\) 的就能切一行,切一行之后上面的贡献是 \(f(i',j-i')\) (每个都 \(-1\),和减去 \(i'\))。然后切掉的这一行一共有 \(i'\) 个,贡献 \(\min(i',r)\)。
注意这里贡献的 \(\min(i',r)\),对于上面的每一种方案都会贡献一次,所以还要乘一个方案数。方案数就是,\(i'\) 个自然数相加等于 \(j-i'\) 的方案数,即 \(\binom{(j-i')+i'-1}{i'-1}=\binom{j-1}{i'-1}\)
顺便别忘了,选这 \(i'\) 个出来还有 \(\binom{i}{i'}\) 种方案。于是,
这样解决了对于每种确定 \(a_i\),\(F\) 的和。还要乘一下确定 \(a_i\) 的方案,推一下发现是 \(d!\) (\(a_i!\) 抵消了),然后除以总方案数是 \(n^{\overline{d}}\),即可。
虽然这题拆期望的那一步很精彩,但这个题感觉还是更像数数题
NOI2013 树的计数
同样,“树的高度”一看就不好做,想都不想肯定先拆贡献。
我们考虑把bfs序重排为 \(1...n\),或者说我们按bfs序一一考虑。
然后考虑怎样会使树的高度 \(+1\)。bfs序是一层一层遍历的,而树的高度就等同于有多少层。所以我们把bfs序分段,一段代表一层,那么它有多少段,树高就是多少。那其实我们数这些分段点的数量就行了。
问题转化问期望有几个分段点
(接下来就跟期望的关系不大了)
我们想想分段点就什么性质。对于同一层里,dfs序肯定是递增的。但是当我们换层的时候,这个dfs序就可能会倒回去(即,bfs序大的点dfs序小),也可能不会。不过反过来是成立的:如果dfs序倒回去了,那一定是出现了分层现象。这是充分的。
于是我们称这些一定要分段的点为 “必分段点”。注意,\(1\) 也是个必分段点。
注意到,对于一条树边 \((f,u)\),\(f\) 是父亲,那肯定 \(dfn(u)=dfn(f)+1\),\(bfn(u)>bfn(f)\),且 \([bfn(f),bfn[u])\) 之间必须一个分段点。为什么必须一个,因为一条树边的深度只会 \(+1\),那就会跨过一层,也就一定会有恰好一个分段点。我们称这样的 \([l,r)\) 为“限制区间”
如果一个限制区间里有一个确定好的必分段点,那其它位置肯定都不是必分段点。
反之,如果没有确定好的必分段点,则 \([l,r)\) 间的dfs序递增。而我们知道它的bfs序恰好是\(l,l+1...r-1\),也是递增的。两个序都递增,只可能是一条链。而我们知道,这中间只有一条树边。所以 \(r=l+1\),相当于区间 \([l,l]\) 里至多有一个分段点。脑子转一转,发现这是废话。于是,如果 \([l,r)\) 中间没有确定好的必分段点,那这条件我们直接不看
上述过程确认了哪些点一定是,哪些点一定不是。至于剩下的点,容易发现,分布分段都可以。
对于一个必分段点,对答案贡献肯定是 \(1\)。而一个二者皆可的点,对答案的贡献是 \(\frac{1}{2}\)。把所有贡献都加起来即可。
CTS2019 随机立方体、氪金手游
见 这里
怎么只有这么点例题啊
会加上的会加上的qaq
我先去睡一觉(