SHOI2014 概率充電器

2022-03-27 06:22:18 字數 2518 閱讀 5666

這是一道概率+樹形\(dp\)

首先我們看到這裡每乙個的貢獻都是1,所以我們要求的期望就是概率

求得其實就是這個

\[\sum_^np_i

\]\(p_i\)為節點\(i\)通電的概率

顯然節點\(i\)通電有三種可能

它自己來電了

它的子樹裡有乙個點來電了傳了過來

它的子樹外面有乙個點來電了傳了過來

第一種情況最好考慮了,至於第二種和第三種我們好像很難解決的樣子

但是這顯然也告訴了我們這是乙個套路題,第二種和第三種正好就是樹規裡的\(up\)

\(and\)

\(down\)思想

於是我們設\(h[i]\)表示第\(i\)個節點通電的概率,之後我們利用\(up\)

\(and\)

\(down\)思想,在第一遍dfs的過程中,\(h[i]\)表示\(i\)通電的概率,且電一定來自它自己或者它的子樹裡(對應第一第二種情況),在第二遍dfs的時候被更新成為電來自於任何地方的概率(對應所有情況)

最開始初始化,\(h[i]=a[i]*0.01\)電只能來自自己

之後第一遍dfs,樹形dp裡的\(up\),我們要將子樹的資訊合併給根,由於根通電還是有兩種可能

根自己來電了

兒子來電,兒子通向根的邊導電

顯然這兩種情況只需要滿足一種就夠了

但是合併之後的概率是多少呢,直接加起來顯然是不對的而我還真加了起來

我們考慮有兩個事件\(a,b\),發生的概率分別是\(p(a),p(b)\),那麼至少發生一件的概率應該是

\[p(a)+p(b)-p(a)*p(b)

\]這個怎麼推出來的,很簡單,至少發生一件,那麼就有三種可能

\(a\)發生\(b\)不發生,那麼則為\(p(a)*(1-p(b))\)

\(b\)發生\(a\)不發生,那麼則為\(p(b)*(1-p(a))\)

\(a,b\)一起發生,那麼則為\(p(a)*p(b)\)

三項合起來最後一化就是\(p(a)+p(b)-p(a)*p(b)\)

所以我們合併根和子樹的資訊的時候,\(p(a)=h[i],p(b)=h[j]*p(i,j)\),\(i\)是子樹的根,\(j\)是\(i\)的兒子,\(p(i,j)\)是這條邊導電的概率

所以\(h[i]=p(a)+p(b)-p(a)*p(b)\)

之後我們就要考慮\(down\)了,乙個節點有點也有可能來自它的父親,於是我們採用\(down\)的思想用父親更新兒子

顯然我們更新一位父親的某個兒子,顯然我們只能用其他點來電傳到父親的概率來更新這個兒子

於是我們設\(p(b)=h[j]*p(i,j)\),而且有

\[p(a)+p(b)-p(a)*p(b)=h[i]

\]我們要求的是\(p(a)\)即除了\(j\)這棵子樹其他點來電使得\(i\)有電的概率

於是解一下這個方程

\[p(a)-p(a)*p(b)=h[i]-p(b)

\]\[p(a)*(1-p(b))=h[i]-p(b)

\]\[p(a)=\frac

\]而之後我們去更新兒子的話還有一邊是否導電需要考慮,於是

\[h[j]=h[j]+(p(a)*p(i,j))-h[j]*p(a)*p(i,j)

\]之後就沒有啦,同時還有乙個非常坑的地方就是如果\(p(b)=h[j]*p(i,j)=1\)

那麼除以\(1-p(b)\)肯定會出錯,由於\(h[j]\)都已經是1了,顯然沒有什麼必要去更新它了,於是可以直接跳過這一層接著往下更新就好了

#include#include#include#define re register

#define maxn 500005

#define eps 1e-7

struct node

e[maxn<<1];

int num,n,m;

int a[maxn],head[maxn],deep[maxn];

double h[maxn];

double ans;

inline int read()

inline void add_edge(int x,int y,int z)

void dfs(int x)//up

}inline int check(double aa,double bb)

double k=(h[x]-h[e[i].v]*double(e[i].w)/100)/(1-h[e[i].v]*double(e[i].w)/100);

k*=double(e[i].w)/100;

h[e[i].v]=h[e[i].v]+k-k*h[e[i].v];

redfs(e[i].v);

}}int main()

for(re int i=1;i<=n;i++)

a[i]=read(),h[i]=a[i]*0.01;

deep[1]=1;

dfs(1);

redfs(1);

printf("%.6lf",ans);

return 0;

}

概率充電器(shoi2014)

出處 輾轉山河弋流歌 by 空灰冰魂 著名的電子產品品牌 shoi 剛剛發布了引領世界潮流的下一代電子產品 概率充電器 採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決定!shoi 概率充電器,您生活不可或缺的必需品!能充上電嗎?現在就試試看 吧!shoi 概率充電器由 n 1 條導線...

SHOI2014 概率充電器

採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決 定!shoi 概率充電器,您生活不可或缺的必需品!能充上電嗎?現在就試試看 吧!shoi 概率充電器由n 1 條導線連通了n 個充電元件。進行充電時,每條導 線是否可以導電以概率決定,每乙個充電元件自身是否直接進行充電也由概率 決定。隨...

SHOI2014 概率充電器

著名的電子產品品牌 shoi 剛剛發布了引領世界潮流的下一代電子產品 概率充電器 採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決定 shoi 概率充電器,您生活不可或缺的必需品 能充上電嗎?現在就試試看吧 shoi 概率充電器由 n 1 條導線連通了 n 個充電元件。進行充電時,每條...