概率期望
這是一個挺大的東西,又涉及到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
我先去睡一覺(