概率期望
概率期望
这是一个挺大的东西,又涉及到dp,又涉及到数学,就不知道咋分类
同时,这也是我最菜的几部分之一
符号 & 定义 & 基础知识
符号&定义
概率
表示事件 发生的概率。
- 对于离散的情况,假设一共有 种情况均匀随机,其中 种使得事件 成立,那么
因此,“概率”在很多情况下可以看作“计数”
当然,直接考虑概率也有好处,它相当于约掉了很多东西,让问题处理起来更加方便
- 对于连续情况:可以使用面积/体积的比来计算概率
表示条件概率,即,我们假设 已经发生的条件下, 多少概率发生。
这里 相当于一个大前提,就是说,假设 的条件 已经 被满足了, 多少概率发生。
期望
对于随机变量 , 表示 的期望。
-
对于离散的情况,它的值就是每一种可能值乘以它对应的概率
如,扔一个标准的骰子,朝上的点数的期望是
此时也可以认为它的值是:所有方案的和/总方案数
-
对于连续的情况,我们可以使用积分等手段计算期望,这里略
基础知识
注意:以下式子全都可以反过来用,做题的时候思维要灵活一些
概率
当 独立(即二者互不影响)时:
设 表示 “ 不发生”,则
这个式子结合上面两个式子,可以使用容斥原理计算概率
(条件概率)
若 恰好能覆盖所有情况(即,完备),对于事件 ,
这个相当于是一个分类讨论,先按 分类,看 在这个条件下多少概率出现
就好比我家里有短裙和短袖,每种红绿蓝三种颜色的各一件,即,一共 件衣服
那我穿红色衣服的概率就是,穿红色短袖的概率+穿红色短裙的概率
期望
当 独立时, (期望的线性性)
这个式子有一个等价的表达,,其中 是任意标量
它在实际使用的时候,可以考虑拆成贡献的形式,然后对于每一个贡献独立,就线性,然后加起来。
比如说逆序对数,可以看成是每有一个 就贡献一次,然后就可以把逆序对拆成每个这样的贡献的和,然后和的期望=期望的和,变成 。
此时, 同样成立。
对于证明,就把一个数写成值乘概率加起来的形式,然后代入进去发现两边一样就证完了。
当 是正整数时,
证明就考虑一下一个 被算多少次就行了,算一算发现这个次数正好是
而对于正整数的情况,期望正好是 , 应该被算 次,正好一样,就对了
对于一个命题 ,。换句话说, 的真假性,就是 为真的概率。很明显对吧
概率的期望
这个东西也是有意义的。
结合实际问题具体的讲,就是:现在我们想要求某个事件 发生的概率 ,有 种可能的情况会发生,第 种情况里面发生 的概率是 。每种情况还有一个发生的概率,设为 。相当于是两层随机,先随机一种情况,一种情况里面是否发生 又是随机的。
此时 发生的概率,可以用全概率公式考虑,就是 。而如果我们以事件为研究对象,那这个东西就等于 ,也就是 的期望。
例题&思维方法 I
这是第一部分,暂且比较简单
(因为这块参考的课件是比较早的课件,好像是noip的集训)
poj2151 简单题
有两个限制:每个队都得做至少一个题(设为条件A),并且至少存在一个队做出来 个题 (设为条件B)
我们要求 的概率。众所周知,
为什么这么考虑呢,因为,正难则反嘛。
先看 怎么做。简单想一下,也得考虑反面做。对于每个队,考虑拿 减去爆零的概率,就是这一个队至少A掉一个题的概率。然后由乘法原理,队之间的概率乘起来,就是同时满足的方案。
接下来看 。考虑 :每个队A掉的题数都 。由于还需要满足条件 ,所以相当于每个队A掉的题都在 里面。
考虑这个咋做。此时熟练的选手脑子里已经有一个GF了。先枚举队,设 表示这个队AC了 个题的方案数。那肯定是,在概率数组里选 个“AC的概率”乘起来,然后选 个 “不AC的概率” 乘起来。我们发现这很GF,直接GF
设当前这个队AC第 个题的概率是 。那很明显 的OGF,设为 ,就是
最后得到当前这个队的答案就是 。每个队的答案乘起来就行了。
朴素的实现是 的。使用分治FFT可以做到 ,这里略(毕竟是10级算法)
这题非常水,但是可以帮助理解概率的“考虑反面”思想,还有条件之间取交,取并的概率的计算。这些是很重要的基础知识,做完这个题之后也可以想一想。
CF601C Kleofáš and the n-thlon
(神秘名字,谁教教我咋念啊)
题目中, 这个人在 比赛里面的排名被设为 。但由于后面要用 ,这里取名叫 。
设 表示第 个人的总得分
我们要求 这个人的排名(定义为小于它的数量+1)的期望。
根据上面期望相关的式子,先转化一波。要求:
注意到对于某人的某次比赛,排第几名都是等概率的。又注意到除了 这个人之外的人,没有本质区别,都可以看做是同一个人,或者说,把两个人换一下完全不影响。感性理解叫 “都是外人”
根据线性性把这个式子拆开,然后根据人之间的等价性,每一项都是一样的。于是变为:
任意。我们后面就称它为“外人”,即,一个不是 的人。
对于 这个人,在第 场比赛里面,排 位的概率都是 ,但是 不能是 。
那它在这一场比赛里,所有可能性构成的OGF就是
我们把每一场比赛的这个 OGF 卷一下, 次方项就是它总得分为 的方案数。取它的 次项和即可。
但是就算拿FFT卷,朴素的复杂度也是 ,不太能过。拿分治FFT写似乎理论复杂度对了,毛估估应该是 的。但是我觉得它应该会很难写,也不应该是标程。这题的这个范围似乎在提示我们,复杂度应该是
考虑这一堆GF,它们只有一个空缺,和全 的多项式非常像。
考虑差分。由于它是两段 组成,所以它的差分应该最多 个位置有值。而多项式这个系数取差分,其实就是卷上一个 ,性质非常好:满足交换律和结合律。也就是说,我们可以先取一堆差分,然后再卷,然后再前缀和做回来,做的顺序不影响。
那这样只有 个位置有值,就算是暴力的从 到 枚举,每次卷积的复杂度也只有 ,总复杂度 。虽然劣一些,但是好写
CF712E Memory and Casinos
(暂时是这篇最难的题)
我们发现题目相当于要我们求区间 ,从 点开始走,一出区间就停止,从区间右边出来的概率。
我们发现它好像有着像链表一样的,能够 接起来 的性质。对于区间 ,我们从 开始,从 右边出来,就会进入 区间,然后我们再利用这个区间的信息,就可以求出从 右边出来的概率。
敏感的同学可能会想到线段树的区间拼接
对!太对了!非常好!
然而,实际情况要复杂一些,因为我们还能跑到下一个区间再回来,再跑过去,再回来...不过能够想象出来这应该是一个等比无穷求和,毕竟这个概率肯定是一个具体的数,那怎么也得收敛对吧。
我们尝试写一写。对于一个区间,记 表示从 开始,一出区间就停止,从区间右边出来的概率。
假设现在我们要把区间接起来。设有两个区间 ,编号 ,相邻(即 )。
我们写一写,诶,回来那一部分如何表示?从下一个区间回来,概率可以从反面考虑,是 。但是从 又回到 ,相当于是:从 开始从右边出来的概率。
同样考虑反面,我们需要维护的就是,从 开始从左边出来的概率。设这个概率是 。
先考虑 如何做:最naive的就是 ,但光有这一项还不够,还有 。那个 表示我们可以任意的过去,回来,过去,回来...这样绕圈。
根据这个,有:
一看,果然是个等比无穷求和。啪的一下写出,( 那个是同理出来的)
然后我们可以用线段树维护这样的合并。
PS:我准备写另一篇blog,着重于讲这种维护区间出入的线段树。
例题&思维方法 II
CF1540B Tree Array
首先是一波线性性,变成:枚举点 , 在 前面涂色的概率之和
第一个染色的点,显然有着本质的区别,这一步枚举不可避。枚举第一个染的点,令它为根,记为 。
设 的 LCA 是 。那染到 两点,肯定得先染到 点,然后有两条分叉,一条冲着 过去,一条冲着 过去。记两个长度为 。
接下来咋搞呢?不会整,重新读一遍题,发现扩展出去每个点都是等概率的,于是,往 方向和往 方向走,概率相同。如果我们只考虑 两条路径,不分叉到别的东西,那可以认为,走任意一边的概率都是
我们发现这个问题和 已经无关,只和 有关。不妨预处理出 表示一条路长 一条路长 , 那一条先被染完,的概率。
容易推出边界:;转移:
预处理出这个,枚举 ,加一加,
关于如何去除LCA的那个log:可以预处理出
LCA[r][x][y]
表示以 为根, 两点的LCA。这个显然可以 的推,于是 就被非常暴力的去掉了
agc028B Removing Blocks
在 笛卡尔树 那一篇学术垃圾里有讲
如果我们把目光放在期望与概率上(而不是笛卡尔树),我们注意到这个式子
, 表示 的祖先。
这个其实也是期望的线性性的转化。由此可见,期望线性性这一条性质看起来简单,实际用起来是非常灵活的。
题
相传是 E.Space 出的题
有一颗treap, 个点权值均匀随机,求每个点深度的期望,输出小数,保留7位
由上一个题的结论,就两个调和加一下就行。调和级数在 比较大的时候可以用 逼近。
CF605E Intergalaxy Trips
设 表示 到 的期望距离
一般都会设成“某个点到终点的期望xxx”,因为这样的好处是,我们可以知道终点的期望值是 ,而且也方便递推
为啥不设起点呢?这里倒是可以,但是有的题里面我们完全可能绕一圈回到起点然后继续走,但是到终点是设定上就要停的
脑子里转两圈想想发现,对于一个点,出现了若干条边,我们肯定选 最小的那个点过去,假设我们真的能够知道过去的这个点 是多少。
那我们怎么知道呢?(ssh队长的代码从而直接知道这个值)
继续想一想,我们跑到的点的 ,肯定比当前点的 小。那对于 超过当前点的,直接不看。也就是说,我们从小到大看所有点的 值。
问题又来了,我不知道它们的 ,我怎么“从小到大”?
注意到 ,显然是最小的,是已知量。我们可以从这个最小值开始扩展,每次找没扩展的点的最小值,那它肯定是第二小;再找,肯定是第三小...相当于一个动态的计算过程,和dijkstra非常像。
每次找一个新点的时候,已经扩展的点的信息都算好了,假设有 个。我们可以把它们按 值从小到大排序。为表达方便,直接把它们编号 。那么,
注:
那个 不用多讲,就是多走一步
前面一半的 是枚举能到的点中 最小的点是 。既然这样,肯定是 到 有边,且 到 前面的点没有边,这时候 才恰好能成为最小值。然后它所用的步数期望就是
后面一半是最拉的情况:所有边都没有,只能原地tp,还要花 的代价。
这样转移一波就行了。复杂度 ,解决 的问题。
如果使用堆优化,可以做 ,复杂度 ,和dij一个复杂度。
wf2018 Gem Island
我们要求最后排名前 大的宝石数的和的期望。这里做一个小转化,我们考虑新增(即,分裂出来)了多少,求出这个之后答案加上 即可。设第 个人的宝石分裂了 次,我们要求 数组前 大的和的期望()
对于每个 ,我们把它想象成是一个柱状图。那我们要求前 高的柱子的高度和。
根据 这个trick,我们考虑这个按列求和,换成是按行求和
我们枚举行(即,枚举值) ,然后看有多少个 ,假设有 个。如果 ,那无疑,这 个数一定被包含在最高的那 个数里面,贡献直接 。然而,如果 ,那么我们只能取前 高的柱子去贡献。哪些柱子是前 高的?我们无法确定,但也不用确定,因为我们可以肯定它对答案的贡献一定是 。
即,我们设 表示 的有多少个。那么对于一种确定的 ,答案为
以上是一种比较具体的考虑方法。接下来是比较抽象的。
设前 大的数为 。则我们要求:
对于 ,设 表示 里面有多少个 。由于我们只考虑前 大的,所以对于每个 我们还要把它和 取个 。
那我们相当于求 。
设式子 。由上面期望的变形之一,我们考虑求所有情况下 的和,除以情况数。
考虑:决定 因素是啥?那当然是由 决定。那 满足什么条件呢?注意到,总共分裂的次数是 ,确定的。那么 的和为 。那么我们的问题是,一堆数的和为 ,我们要算,所有可能性的 的和。
于是,我们设 表示 个数和为 , 的和。还是依着那个具体的考虑方法,我们每次切掉最下面一行,看看会如何。能够切掉一行,那得 。于是我们枚举 ,表示当前选的 个数里面有 个 的。然后我们看这些 的就能切一行,切一行之后上面的贡献是 (每个都 ,和减去 )。然后切掉的这一行一共有 个,贡献 。
注意这里贡献的 ,对于上面的每一种方案都会贡献一次,所以还要乘一个方案数。方案数就是, 个自然数相加等于 的方案数,即
顺便别忘了,选这 个出来还有 种方案。于是,
这样解决了对于每种确定 , 的和。还要乘一下确定 的方案,推一下发现是 ( 抵消了),然后除以总方案数是 ,即可。
虽然这题拆期望的那一步很精彩,但这个题感觉还是更像数数题
NOI2013 树的计数
同样,“树的高度”一看就不好做,想都不想肯定先拆贡献。
我们考虑把bfs序重排为 ,或者说我们按bfs序一一考虑。
然后考虑怎样会使树的高度 。bfs序是一层一层遍历的,而树的高度就等同于有多少层。所以我们把bfs序分段,一段代表一层,那么它有多少段,树高就是多少。那其实我们数这些分段点的数量就行了。
问题转化问期望有几个分段点
(接下来就跟期望的关系不大了)
我们想想分段点就什么性质。对于同一层里,dfs序肯定是递增的。但是当我们换层的时候,这个dfs序就可能会倒回去(即,bfs序大的点dfs序小),也可能不会。不过反过来是成立的:如果dfs序倒回去了,那一定是出现了分层现象。这是充分的。
于是我们称这些一定要分段的点为 “必分段点”。注意, 也是个必分段点。
注意到,对于一条树边 , 是父亲,那肯定 ,,且 之间必须一个分段点。为什么必须一个,因为一条树边的深度只会 ,那就会跨过一层,也就一定会有恰好一个分段点。我们称这样的 为“限制区间”
如果一个限制区间里有一个确定好的必分段点,那其它位置肯定都不是必分段点。
反之,如果没有确定好的必分段点,则 间的dfs序递增。而我们知道它的bfs序恰好是,也是递增的。两个序都递增,只可能是一条链。而我们知道,这中间只有一条树边。所以 ,相当于区间 里至多有一个分段点。脑子转一转,发现这是废话。于是,如果 中间没有确定好的必分段点,那这条件我们直接不看
上述过程确认了哪些点一定是,哪些点一定不是。至于剩下的点,容易发现,分布分段都可以。
对于一个必分段点,对答案贡献肯定是 。而一个二者皆可的点,对答案的贡献是 。把所有贡献都加起来即可。
CTS2019 随机立方体、氪金手游
见 这里
怎么只有这么点例题啊
会加上的会加上的qaq
我先去睡一觉(
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效