洛谷P4284 概率充電器

2022-06-13 15:12:08 字數 1236 閱讀 4145

「採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決定!shoi 概率充電器,您生活不可或缺的必需品!能充上電嗎?現在就試試看吧!」

shoi 概率充電器由n-1 條導線連通了n 個充電元件。進行充電時,每條導線是否可以導電以概率決定,每乙個充電元件自身是否直接進行充電也由概率決定。隨後電能可以從直接充電的元件經過通電的導線使得其他充電元件進行間接充電。

作為shoi 公司的忠實客戶,你無法抑制自己購買shoi 產品的衝動。在排了乙個星期的長隊之後終於入手了最新型號的shoi 概率充電器。你迫不及待地將shoi 概率充電器插入電源——這時你突然想知道,進入充電狀態的元件個數的期望是多少呢?

設 \(f[x]\) 表示以 \(x\) 為根的子樹內,\(x\) 不充電的期望。

考慮 \(x\) 的每乙個子節點 \(y\),設他們之間導線可以導電的概率為 \(p\),顯然有

\[f[x]=(1-q[x])\times \pi_(x)}1-p(1-f[y])

\]那麼我們就可以 \(o(n)\) 處理出點 \(1\) 的答案。

接下來很顯然是換根,設 \(g[x]\) 表示點 \(x\) 不被充電的概率,則

\[g[v]=(1-(p·\frac))\times f[v]

\]其中中間一大坨是 \(v\) 對 \(x\) 做的貢獻,所以要在 \(g[x]\) 中去掉。

注意當中間除數為 \(0\) 的時候要特判,此時的意義是外面的點無論如何都無法給 \(v\) 充電,直接將中間一坨改為 \(1\) 即可。

時間複雜度 \(o(n)\)。

#include using namespace std;

const int n=500010;

int n,tot,head[n];

long double ans,f[n],g[n];

struct edge

e[n*2];

void add(int from,int to,int p)

void dfs1(int x,int fa) }}

void dfs2(int x,int fa) }}

int main()

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

scanf("%lf",&f[i]);

dfs1(1,0);

g[1]=f[1];

dfs2(1,0);

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

return 0;

}

P4284 SHOI2014 概率充電器

傳送門 首先根據那啥啥期望的線性性,被充電原件的期望個數等於所有原件被充電的概率之和,於是我們考慮如何計算每乙個原件被充電的概率 首先自己被充電和被導電兩個概率是互相獨立的,計算還得容斥很麻煩,於是我們考慮轉為計算每個原件不會被導電的概率。乙個原件不導電就是自己沒電,別的節點也不會給它電。而別的節點...

概率充電器

記憶體限制 256 mib 時間限制 2000 ms 標準輸入輸出 題目描述 著名的電子產品品牌 shoi 剛剛發布了引領世界潮流的下一代電子產品 概率充電器 採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決定 shoi 概率充電器,您生活不可或缺的必需品 能充上電嗎?現在就試試看吧 ...

概率充電器(shoi2014)

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