Loj #2192. 「SHOI2014」概率充电器

Loj #2192. 「SHOI2014」概率充电器

题目描述

著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:

「采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生

活不可或缺的必需品!能充上电吗?现在就试试看吧!」

SHOI 概率充电器由 \(n-1\) 条导线连通了 \(n\) 个充电元件。进行充电时,每条导线是否可以导电以

概率决定,每一个充电元件自身是否直接进行充电也由概率决定。随后电能可以从直接充电的元件经过

通电的导线使得其他充电元件进行间接充电。

作为 SHOI 公司的忠实客户,你无法抑制自己购买 SHOI 产品的冲动。在排了一个星期的长队之后终

于入手了最新型号的 SHOI 概率充电器。你迫不及待地将 SHOI 概率充电器插入电源——这时你突然想

知道,进入充电状态的元件个数的期望是多少呢?

输入格式

第一行一个整数 \(n\),概率充电器的充电元件个数,充电元件由 \(1 \sim n\) 编号。

之后的 \(n-1\) 行每行三个整数 \(a, b, p\),描述了一根导线连接了编号为 \(a\) 和 \(b\) 的充电元

件,通电概率为 \(p\, \%\)。

第 \(n+2\) 行 \(n\) 个整数 \(q_1,\ldots,q_n\)。表示 \(i\) 号元件直接充电的概率为 \(q_i\, \%\)。

输出格式

输出一行一个实数,为进入充电状态的元件个数的期望,四舍五入到六位小数。

数据范围与提示

对于 \(100\%\) 的数据,\(n \leq 500000,\ 0 \leq p,q_i \leq 100\)。

\(\\\)

根据期望的线性性,我们统计每个点通电出现的概率。发现统计每个点不通电的概率好统计些,也就是该点所在联通块一个点都不通电。

上下两次树形\(DP\)就搞定了。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 500005

using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}

int n;
struct road {
    int to,nxt;
    double p;
}s[N<<1];

int h[N],cnt;
void add(int i,int j,double p) {
    s[++cnt]=(road) {j,h[i],p};h[i]=cnt;
}

double f[N];
double up[N];
double q[N];

void dfs(int v,int fr) {
    f[v]=1-q[v];
    for(int i=h[v];i;i=s[i].nxt) {
        int to=s[i].to;
        if(to==fr) continue ;
        dfs(to,v);
        f[v]=f[v]*(s[i].p*f[to]+(1.0-s[i].p));
    }
}

double pre[N],suf[N];
double ans;
void dfs2(int v,int fr) {
    ans+=1.0-f[v]*up[v];
    vector<int>tem;
    vector<double>E;
    tem.clear();
    E.clear();
    for(int i=h[v];i;i=s[i].nxt) {
        int to=s[i].to;
        if(to==fr) continue ;
        tem.push_back(to);
        E.push_back(s[i].p);
        suf[to]=pre[to]=s[i].p*f[to]+(1.0-s[i].p);
    }
    for(int i=1;i<tem.size();i++) pre[tem[i]]=pre[tem[i]]*pre[tem[i-1]];
    for(int i=tem.size()-2;i>=0;i--) suf[tem[i]]=suf[tem[i]]*suf[tem[i+1]];
    for(int i=0;i<tem.size();i++) {
        int to=tem[i];
        double now=1;
        if(i>0) now=now*pre[tem[i-1]];
        if(i<tem.size()-1) now=now*suf[tem[i+1]];
        up[to]=up[v]*now*(1.0-q[v])*E[i]+(1.0-E[i]);
        dfs2(to,v);
    }
}

int main() {
    n=Get();
    int a,b,p;
    for(int i=1;i<n;i++) {
        a=Get(),b=Get(),p=Get();
        add(a,b,1.0*p/100);
        add(b,a,1.0*p/100);
    }
    for(int i=1;i<=n;i++) q[i]=1.0*Get()/100;
    dfs(1,0);
    up[1]=1;
    dfs2(1,0);
    cout<<fixed<<setprecision(6)<<ans;
    return 0;
}

原文地址:https://www.cnblogs.com/hchhch233/p/10792065.html

时间: 2024-08-29 18:15:07

Loj #2192. 「SHOI2014」概率充电器的相关文章

loj#2552. 「CTSC2018」假面

题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的概率,\(d_i\)为死掉的概率,\(g_{i,j}\)是除i以外活了j个人的概率 那个选中i人的答案就是 \[a_i\times\sum_{j = 0} ^{k - 1}\frac{g_{i,j}}{j + 1}\] 对于\(g_{i,j}\) ,设\(f_{i,j}\)表示前\(i\)个人有\(

loj#2076. 「JSOI2016」炸弹攻击 模拟退火

目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的的概率降低 代码 #include<ctime> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define gc getchar() #define

Loj #2541「PKUWC2018」猎人杀

Loj #2541. 「PKUWC2018」猎人杀 题目链接 好巧妙的题! 游戏过程中,概率的分母一直在变化,所以就非常的不可做. 所以我们将问题转化一下:我们可以重复选择相同的猎人,只不过在一个猎人被选择了过后我们就给他打上标记,再次选择他的时候就无效.这样与原问题是等价的. 证明: 设\(sum=\sum_iw_i,kill=\sum_{i被杀死了}w_i\). 攻击到未被杀死的猎人\(i\)的概率为\(P\). 则根据题意\(P=\frac{w_i}{sum-kill}\). 问题转化后:

Loj #2542. 「PKUWC2018」随机游走

Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步. 特别地,点 \(x\)(即起点)视为一开始就被经过了一次. 答案对 $998244353 $ 取模. 输入格式 第一行三个正整数 \(n,Q,x\). 接下来 \(

Loj #3111. 「SDOI2019」染色

Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色. 现在一共有 \(c\) 种不同的颜色,依次记为 \(1\) 到 \(c\).请问有多少对未染色结点的合法染色方案? 输入格式 第一行有两个整数 \(n\) 和 \(c\),分别描述了格点图的大小和总的颜色个数. 之后两行,每行有 \(n\) 个整数:如果是 \(0\) 则表示对应结点未被染色,否

Loj #2553. 「CTSC2018」暴力写挂

Loj #2553. 「CTSC2018」暴力写挂 题目描述 temporaryDO 是一个很菜的 OIer .在 4 月,他在省队选拔赛的考场上见到了<林克卡特树>一题,其中 \(k = 0\) 的部分分是求树 \(T\) 上的最长链.可怜的 temporaryDO 并不会做这道题,他在考场上抓猫耳挠猫腮都想不出一点思路. 这时,善良的板板出现在了空中,他的身上发出璀璨却柔和的光芒,荡漾在考场上.''题目并不难.'' 板板说.那充满磁性的声音,让 temporaryDO 全身充满了力量. 他

Loj #2554. 「CTSC2018」青蕈领主

Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概念产生了浓厚的兴趣.小绿打算把连续的概念放到由整数构成的序列上,他定义一个长度为 \(m\) 的整数序列是连续的,当且仅当这个序列中的最大值与最小值的差,不超过\(m-1\).例如 \(\{1,3,2\}\) 是连续的,而 \(\{1,3\}\) 不是连续的. 某天,小绿的顶头上司板老大,给了小绿 \(T\)

LOJ #2037. 「SHOI2015」脑洞治疗仪

#2037. 「SHOI2015」脑洞治疗仪 题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.1 代表这个位置的脑组织正常工作,0 代表这是一块脑洞. 1 0 1 0 0 0 1 1 1 0 脑洞治疗仪修补某一块脑洞的基本工作原理就是将另一块连续区域挖出,将其中正常工作的脑组织填补在这块脑洞中.(所以脑洞治疗仪是脑洞的治疗仪?) 例如,用上面第 8 号位置到第 

LOJ #2141. 「SHOI2017」期末考试

题目链接 LOJ #2141 题解 据说这道题可以三分(甚至二分)? 反正我是枚举的 = = 先将t和b数组排序后计算出前缀和, 然后枚举最晚的出成绩时间,每次可以O(1)直接计算调整到该时间所需的代价. 如何计算? 对于学生不满意造成的代价,是 (不满意人数 * 最晚结束时间) - 所有不满的人的t之和; 对于调整老师造成的代价, A < B 时先用A调整 (可用前缀和计算出有多少时间能用来交换,又有多少时间需要被交换)再用B调整仍超出的部分; 否则都用B调整. 真的如高大佬所言是sb题啊 =