概率期望

 


概率期望

这是一个挺大的东西,又涉及到dp,又涉及到数学,就不知道咋分类

同时,这也是我最菜的几部分之一

符号 & 定义 & 基础知识

符号&定义

概率

P(A)​ 表示事件 A​​ 发生的概率。

  1. 对于离散的情况,假设一共有 n 种情况均匀随机,其中 m 种使得事件 A 成立,那么 P(A)=mn

因此,“概率”在很多情况下可以看作“计数”

当然,直接考虑概率也有好处,它相当于约掉了很多东西,让问题处理起来更加方便

  1. 对于连续情况:可以使用面积/体积的比来计算概率

P(A|B) 表示条件概率,即,我们假设 B 已经发生的条件下,A 多少概率发生。

这里 B 相当于一个大前提,就是说,假设 B 的条件 已经 被满足了,A 多少概率发生。
P(A|B)=P(AB)P(B)

期望

对于随机变量 xE(x) 表示 x 的期望。

  1. 对于离散的情况,它的值就是每一种可能值乘以它对应的概率

    如,扔一个标准的骰子,朝上的点数的期望是 1×16+2×16...+6×16=3.5

    此时也可以认为它的值是:所有方案的和/总方案数

  2. 对于连续的情况,我们可以使用积分等手段计算期望,这里略

基础知识

注意:以下式子全都可以反过来用,做题的时候思维要灵活一些

概率

A,B 独立(即二者互不影响)时:

  1. P(AB)=P(A)×P(B)
  2. P(AB)=P(A)+P(B)

A¯ 表示 “A 不发生”,则 P(A¯)=1P(A)

这个式子结合上面两个式子,可以使用容斥原理计算概率

P(A|B)=P(AB)P(B) (条件概率)

A1,A2...An​ 恰好能覆盖所有情况(即,完备),对于事件 B​,P(B)=i=1nP(B|Ai)×P(Ai)

这个相当于是一个分类讨论,先按 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,ai>aj​​​​​​ 就贡献一次,然后就可以把逆序对拆成每个这样的贡献的和,然后和的期望=期望的和,变成 i<jP(ai>aj)

此时,E(xy)=E(x)E(y) 同样成立。

对于证明,就把一个数写成值乘概率加起来的形式,然后代入进去发现两边一样就证完了。

x 是正整数时,E(x)=iP(xi)

证明就考虑一下一个 P(i) 被算多少次就行了,算一算发现这个次数正好是 1,2,3...n

而对于正整数的情况,期望正好是 ii×P(i)P(i) 应该被算 1,2,3...n 次,正好一样,就对了

对于一个命题 p​​,E([p])=P(p)​​。换句话说,[p]​ 的真假性,就是 p​ 为真的概率。很明显对吧

概率的期望

这个东西也是有意义的。

结合实际问题具体的讲,就是:现在我们想要求某个事件 A 发生的概率 P,有 n 种可能的情况会发生,第 i 种情况里面发生 A 的概率是 Pi。每种情况还有一个发生的概率,设为 Qi。相当于是两层随机,先随机一种情况,一种情况里面是否发生 A 又是随机的。

此时 A​ 发生的概率,可以用全概率公式考虑,就是 i=1nQi×Pi。而如果我们以事件为研究对象,那这个东西就等于 E(P),也就是 P 的期望。

例题&思维方法 I

这是第一部分,暂且比较简单

(因为这块参考的课件是比较早的课件,好像是noip的集训)

poj2151 简单题

有两个限制:每个队都得做至少一个题(设为条件A),并且至少存在一个队做出来 k 个题 (设为条件B)

我们要求 AB 的概率。众所周知,P(AB)=P(A)P(AB¯)

为什么这么考虑呢,因为,正难则反嘛。

先看 P(A) 怎么做。简单想一下,也得考虑反面做。对于每个队,考虑拿 1 减去爆零的概率,就是这一个队至少A掉一个题的概率。然后由乘法原理,队之间的概率乘起来,就是同时满足的方案。

接下来看 P(AB¯)。考虑 B¯ :每个队A掉的题数都 k1。由于还需要满足条件 A,所以相当于每个队A掉的题都在 [1,k1] 里面。

考虑这个咋做。此时熟练的选手脑子里已经有一个GF了。先枚举队,设 f(i) 表示这个队AC了 i 个题的方案数。那肯定是,在概率数组里选 i 个“AC的概率”乘起来,然后选 mi 个 “不AC的概率” 乘起来。我们发现这很GF,直接GF

设当前这个队AC第 i 个题的概率是 pi。那很明显 f 的OGF,设为 F,就是

i=1m(1pi)+pix

最后得到当前这个队的答案就是 F[x1...xk1]。每个队的答案乘起来就行了。

朴素的实现是 O(nm2) 的。使用分治FFT可以做到 O(nmlogm),这里略(毕竟是10级算法

这题非常水,但是可以帮助理解概率的“考虑反面”思想,还有条件之间取交,取并的概率的计算。这些是很重要的基础知识,做完这个题之后也可以想一想。

CF601C Kleofáš and the n-thlon

(神秘名字,谁教教我咋念啊)

题目中,k 这个人在 i 比赛里面的排名被设为 xi。但由于后面要用 x ,这里取名叫 pi

si 表示第 i 个人的总得分

我们要求 k 这个人的排名(定义为小于它的数量+1)的期望。

根据上面期望相关的式子,先转化一波。要求:

E(ik[si<sk])

注意到对于某人的某次比赛,排第几名都是等概率的。又注意到除了 k 这个人之外的人,没有本质区别,都可以看做是同一个人,或者说,把两个人换一下完全不影响。感性理解叫 “都是外人”

根据线性性把这个式子拆开,然后根据人之间的等价性,每一项都是一样的。于是变为:

(m1)×E(si<sk),ik

i 任意。我们后面就称它为“外人”,即,一个不是 k 的人。

对于 i 这个人,在第 j 场比赛里面,排 r 位的概率都是 1m1,但是 r 不能是 pj

那它在这一场比赛里,所有可能性构成的OGF就是 i=1m[ir]1m1xi

我们把每一场比赛的这个 OGF 卷一下,i 次方项就是它总得分为 i 的方案数。取它的 [1,sk) 次项和即可。

但是就算拿FFT卷,朴素的复杂度也是 O(n2mlog(nm)),不太能过。拿分治FFT写似乎理论复杂度对了,毛估估应该是 O(nmlog(nm)) 的。但是我觉得它应该会很难写,也不应该是标程。这题的这个范围似乎在提示我们,复杂度应该是 O(n2m)

考虑这一堆GF,它们只有一个空缺,和全 1 的多项式非常像。

考虑差分。由于它是两段 1 组成,所以它的差分应该最多 4 个位置有值。而多项式这个系数取差分,其实就是卷上一个 1x,性质非常好:满足交换律和结合律。也就是说,我们可以先取一堆差分,然后再卷,然后再前缀和做回来,做的顺序不影响。

那这样只有 4​ 个位置有值,就算是暴力的从 1​ 到 n​ 枚举,每次卷积的复杂度也只有 O(4nm)=O(nm)​,总复杂度 O(n2m)​​​。虽然劣一些,但是好写

CF712E Memory and Casinos

(暂时是这篇最难的题)

我们发现题目相当于要我们求区间 [l,r],从 l 点开始走,一出区间就停止,从区间右边出来的概率。

我们发现它好像有着像链表一样的,能够 接起来 的性质。对于区间 [l,p],[p+1,r]​,我们从 l​ 开始,从 p​ 右边出来,就会进入 [p+1,r]​ 区间,然后我们再利用这个区间的信息,就可以求出从 r​​ 右边出来的概率。

敏感的同学可能会想到线段树的区间拼接

对!太对了!非常好!

然而,实际情况要复杂一些,因为我们还能跑到下一个区间再回来,再跑过去,再回来...不过能够想象出来这应该是一个等比无穷求和,毕竟这个概率肯定是一个具体的数,那怎么也得收敛对吧。

我们尝试写一写。对于一个区间,记 P 表示从 l​ 开始,一出区间就停止,从区间右边出来的概率。

假设现在我们要把区间接起来。设有两个区间 [l1,r1],[l2,r2],编号 1,2,相邻(即 r1+1=l2)。

我们写一写,诶,回来那一部分如何表示?从下一个区间回来,概率可以从反面考虑,是 1P2。但是从 1 又回到 2,相当于是:从 r 开始从右边出来的概率。

同样考虑反面,我们需要维护的就是,从 r 开始从左边出来的概率。设这个概率是 Q

先考虑 P​ 如何做:最naive的就是 P1P2​,但光有这一项还不够,还有 P1P2×[(1P2)(1Q1)]k。那个 k​ 表示我们可以任意​的过去,回来,过去,回来...这样绕圈。

根据这个,有:

P=P1P2×k=0[(1P2)(1Q1)]k

一看,果然是个等比无穷求和。啪的一下写出,(Q 那个是同理出来的)

P=P1P21(1P2)(1Q1),Q=Q1Q21(1P2)(1Q1)

然后我们可以用线段树维护这样的合并。

PS:我准备写另一篇blog,着重于讲这种维护区间出入的线段树。

例题&思维方法 II

CF1540B Tree Array

首先是一波线性性,变成:枚举点 a<bba 前面涂色的概率之和

第一个染色的点,显然有着本质的区别,这一步枚举不可避。枚举第一个染的点,令它为根,记为 r

a,b 的 LCA 是 L。那染到 a,b 两点,肯定得先染到 L 点,然后有两条分叉,一条冲着 a 过去,一条冲着 b 过去。记两个长度为 la,lb

接下来咋搞呢?不会整,重新读一遍题,发现扩展出去每个点都是等概率的,于是,往 a 方向和往 b 方向走,概率相同。如果我们只考虑 a,b​ 两条路径,不分叉到别的东西,那可以认为,走任意一边的概率都是 1/2

我们发现这个问题和 a,b,L 已经无关,只和 la,lb 有关。不妨预处理出 f(x,y) 表示一条路长 x 一条路长 yx 那一条先被染完,的概率。

容易推出边界:f(x,0)=0,f(0,y)=1;转移:f(x,y)=12(f(x1,y)+f(x,y1))

预处理出这个,枚举 a,b,r,加一加,O(n3)

关于如何去除LCA的那个log:可以预处理出 LCA[r][x][y] 表示以 r 为根,x,y 两点的LCA。这个显然可以 O(1) 的推,于是 log 就被非常暴力的去掉了

agc028B Removing Blocks

笛卡尔树 那一篇学术垃圾里有讲

如果我们把目光放在期望与概率上(而不是笛卡尔树),我们注意到这个式子

E(depi)=jP(janc(i))anc(u) 表示 u 的祖先。

这个其实也是期望的线性性的转化。由此可见,期望线性性这一条性质看起来简单,实际用起来是非常灵活的。

相传是 E.Space 出的题

有一颗treap,n 个点权值均匀随机,求每个点深度的期望,输出小数,保留7位

由上一个题的结论,就两个调和加一下就行。调和级数在 n 比较大的时候可以用 nlnn+ϵ 逼近。

CF605E Intergalaxy Trips

E(x) 表示 xn 的期望距离

一般都会设成“某个点到终点的期望xxx”,因为这样的好处是,我们可以知道终点的期望值是 0,而且也方便递推

为啥不设起点呢?这里倒是可以,但是有的题里面我们完全可能绕一圈回到起点然后继续走,但是到终点是设定上就要停的

脑子里转两圈想想发现,对于一个点,出现了若干条边,我们肯定选 E 最小的那个点过去,假设我们真的能够知道过去的这个点 E 是多少。

那我们怎么知道呢?(ssh队长的代码从而直接知道这个值)

继续想一想,我们跑到的点的 E,肯定比当前点的 E 小。那对于 E 超过当前点的,直接不看。也就是说,我们从小到大看所有点的 E 值。

问题又来了,我不知道它们的 E,我怎么“从小到大”?

注意到 E(n)=0,显然是最小的,是已知量。我们可以从这个最小值开始扩展,每次找没扩展的点的最小值,那它肯定是第二小;再找,肯定是第三小...相当于一个动态的计算过程,和dijkstra非常像。

每次找一个新点的时候,已经扩展的点的信息都算好了,假设有 k 个。我们可以把它们按 E 值从小到大排序。为表达方便,直接把它们编号 1k。那么,

E(u)=(i=1kE(i)×p(u,i)×j=1i1p(u,j)+i=1k(1p(u,i))×E(u))+1

注:

那个 +1​ 不用多讲,就是多走一步

前面一半的 i 是枚举能到的点中 E 最小的点是 i。既然这样,肯定是 ui 有边,且 ui 前面的点没有边,这时候 i 才恰好能成为最小值。然后它所用的步数期望就是 E(i)

后面一半是最拉的情况:所有边都没有,只能原地tp,还要花 1 的代价。

这样转移一波就行了。复杂度 O(n2),解决 n,m1000 的问题。

如果使用堆优化,可以做 n,m106,复杂度 O(mlogn),和dij一个复杂度。

wf2018 Gem Island

我们要求最后排名前 r 大的宝石数的和的期望。这里做一个小转化,我们考虑新增(即,分裂出来)了多少,求出这个之后答案加上 r 即可。设第 i 个人的宝石分裂了 ai 次,我们要求 a 数组前 r 大的和的期望(+r

对于每个 ai,我们把它想象成是一个柱状图。那我们要求前 r 高的柱子的高度和。

根据 这个trick,我们考虑这个按列求和,换成是按行求和

我们枚举行(即,枚举值) x​,然后看有多少个 aix​,假设有 c​ 个。如果 cr​,那无疑,这 c​ 个数一定被包含在最高的那 r​​ 个数里面,贡献直接 +c​。然而,如果 c>r,那么我们只能取前 r 高的柱子去贡献。哪些柱子是前 r 高的?我们无法确定,但也不用确定,因为我们可以肯定它对答案的贡献一定是 +r

即,我们设 cx​​​ 表示 x​​​ 的有多少个。那么对于一种确定的 ai​​​,答案为 i=1min(cx,r)​​​

以上是一种比较具体的考虑方法。接下来是比较抽象的。

设前 r 大的数为 ap1,ap2...apr。则我们要求:

E(i=1rapi)=i=1rE(api)=i=1rx=1P(apix)=i=1rx=1E([apix])=x=1E(i=1r[apix])

对于 x,设 cx 表示 a 里面有多少个 x。由于我们只考虑前 r 大的,所以对于每个 c 我们还要把它和 r 取个 min

那我们相当于求 E(x=1min(cx,r))

设式子 F=x=1min(cx,r)。由上面期望的变形之一,我们考虑求所有情况下 F​​ 的和,除以情况数。

考虑:决定 c 因素是啥?那当然是由 a 决定。那 a 满足什么条件呢?注意到,总共分裂的次数是 d,确定的。那么 a 的和为 d。那么我们的问题是,一堆数的和为 d,我们要算,所有可能性的 F 的和。

于是,我们设 f(i,j)​ 表示 i​ 个数和为 j​,F​​ 的和。还是依着那个具体的考虑方法,我们每次切掉最下面一行,看看会如何。能够切掉一行,那得 1。于是我们枚举 i,表示当前选的 i 个数里面有 i1 的。然后我们看这些 1 的就能切一行,切一行之后上面的贡献是 f(i,ji) (每个都 1,和减去 i)。然后切掉的这一行一共有 i 个,贡献 min(i,r)

注意这里贡献的 min(i,r),对于上面的每一种方案都会贡献一次,所以还要乘一个方案数。方案数就是,i 个自然数相加等于 ji 的方案数,即 ((ji)+i1i1)=(j1i1)

顺便别忘了,选这 i 个出来还有 (ii) 种方案。于是,

f(i,j)=i=0i(ii)×(min(i,r)×(j1i1)+f(i,ji))

这样解决了对于每种确定 aiF 的和。还要乘一下确定 ai 的方案,推一下发现是 d!ai! 抵消了),然后除以总方案数是 nd¯,即可。

虽然这题拆期望的那一步很精彩,但这个题感觉还是更像数数题

NOI2013 树的计数

同样,“树的高度”一看就不好做,想都不想肯定先拆贡献。

我们考虑把bfs序重排为 1...n,或者说我们按bfs序一一考虑。

然后考虑怎样会使树的高度 +1​。bfs序是一层一层遍历的,而树的高度就等同于有多少层。所以我们把bfs序分段,一段代表一层,那么它有多少段,树高就是多少。那其实我们数这些分段点的数量就行了。

问题转化问期望有几个分段点

(接下来就跟期望的关系不大了)

我们想想分段点就什么性质。对于同一层里,dfs序肯定是递增的。但是当我们换层的时候,这个dfs序就可能会倒回去(即,bfs序大的点dfs序小),也可能不会。不过反过来是成立的:如果dfs序倒回去了,那一定是出现了分层现象。这是充分的。

于是我们称这些一定要分段的点为 “必分段点”。注意,1 也是个必分段点。

注意到,对于一条树边 (f,u)f 是父亲,那肯定 dfn(u)=dfn(f)+1bfn(u)>bfn(f),且 [bfn(f),bfn[u]) 之间必须一个分段点。为什么必须一个,因为一条树边的深度只会 +1,那就会跨过一层,也就一定会有恰好一个分段点。我们称这样的 [l,r) 为“限制区间”

如果一个限制区间里有一个确定好的必分段点,那其它位置肯定都不是必分段点。

反之,如果没有确定好的必分段点,则 [l,r)​ 间的dfs序递增。而我们知道它的bfs序恰好是l,l+1...r1,也是递增的。两个序都递增,只可能是一条链。而我们知道,这中间只有一条树边。所以 r=l+1,相当于区间 [l,l] 里至多有一个分段点。脑子转一转,发现这是废话。于是,如果 [l,r) 中间没有确定好的必分段点,那这条件我们直接不看

上述过程确认了哪些点一定是,哪些点一定不是。至于剩下的点,容易发现,分布分段都可以。

对于一个必分段点,对答案贡献肯定是 1​。而一个二者皆可的点,对答案的贡献是 12​​。把所有贡献都加起来即可。

CTS2019 随机立方体、氪金手游

这里

怎么只有这么点例题啊

会加上的会加上的qaq

我先去睡一觉(

posted @   Flandre-Zhu  阅读(1894)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示