注意到本题的贡献是不带权的,所以期望其实就是每个点的概率之和。

本题正着做好像不是很好做,要考虑 \(P(A+B)=P(A)+P(B)-P(A)P(B)\) 的容斥(因为这是两个条件至少满足一个,所以是求集合并的概率),具体可以看这个

所以我们考虑反着做。设 \(f_u\) 表示 \(u\) 点没有通电的概率,那么有

\[f_u=(1-p_u)\prod_{v\in(u,v)}(1-p(u,v)+p(u,v)f_v)
\]

这个点先要自己不亮,然后周围的点要么边不导电,要么边导电但链接的那个不通电,注意到后面那个其实算的是 \(P(A)+P(A|B)\)。

发现有后效性,我们考虑换根 DP,重新设 \(f_u\) 表示只考虑在 \(u\) 的子树中的点使得 \(u\) 不亮的概率,于是刚才的式子变成了

\[f_u=(1-p_u)\prod_{v\in{\rm son}(u)}(1-p(u,v)+p(u,v)f_v)
\]

第一遍 DP 后根的答案已经正确了,考虑从 \(fa\) 推向 \(u\),设 \(g_u\) 是根为 \(u\) 时的答案。有

\[g_u=f_u\left(1-w(u,fa)+\frac{w(u,fa)g_{fa}}{1-w(u,fa)+w(u,fa)f_u}\right)
\]

注意要判断除数为 \(0\) 的情况,提供一组 hack 数据:

Input:
3
1 2 100
2 3 100
0 100 0
Output:
3.000000
#include <bits/stdc++.h>
using namespace std; const int N=5e5+5;
struct Edge{int to,nxt;double w;}e[N*2];
int n,head[N],cntE;
double ans,p[N],f[N],g[N]; inline void add(int u,int v,double w) {e[++cntE]=(Edge){v,head[u],w},head[u]=cntE;} void dfs1(int u,int fa)
{
f[u]=1-p[u];
for(int i=head[u],v;i;i=e[i].nxt)
if((v=e[i].to)!=fa)
dfs1(v,u),f[u]*=(1-e[i].w+e[i].w*f[v]);
} void dfs2(int u,int fa)
{
ans+=1-g[u];
for(int i=head[u],v;i;i=e[i].nxt)
if((v=e[i].to)!=fa)
{
if(e[i].w+e[i].w*f[v]==1) g[v]=f[v];
else
{
double tmp=g[u]/(1-e[i].w+e[i].w*f[v]);
g[v]=f[v]*(1-e[i].w+e[i].w*tmp);
}
dfs2(v,u);
}
} int main()
{
scanf("%d",&n);
for(int i=1,a,b;i<n;++i)
{
double c;
scanf("%d%d%lf",&a,&b,&c); c/=100;
add(a,b,c); add(b,a,c);
}
for(int i=1;i<=n;++i) scanf("%lf",p+i),p[i]/=100;
dfs1(1,0); g[1]=f[1]; dfs2(1,0);
printf("%.6f",ans);
return 0;
}

[SHOI2014]概率充电器 题解的更多相关文章

  1. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  2. BZOJ3566: [SHOI2014]概率充电器 树形+概率dp

    3566: [SHOI2014]概率充电器 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1888  Solved: 857[Submit][Stat ...

  3. 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP

    [BZOJ3566][SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线 ...

  4. BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)

    3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...

  5. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...

  6. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. P4284 [SHOI2014]概率充电器

    P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...

  8. 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)

    3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...

  9. BZOJ3566 SHOI2014 概率充电器 【概率DP】

    BZOJ3566 SHOI2014 概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能 ...

随机推荐

  1. 【NX二次开发】Block UI 线型

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  2. 面试官:MySQL的可重复读级别能解决幻读问题吗?

    引言 之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于 ...

  3. 使用Go module和GoLand初始化一个Go项目

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 Golang是一门优秀的语言,特别是在并发编程上,得益于它的协程和channel等,非常方便易用.它通过go m ...

  4. Android系统编程入门系列之加载界面Activity

    上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...

  5. uniapp 打包IOS 更新AppStore版本

    Hello 你好,我是大粽子. 最近随着新版本UI的发布APP也随之更新,随之而来的也就是IOS程序提审步骤,这次我详细的截图了每一个步骤,如果你正好也需要那么跟着我的节奏一步步来肯定是没问题的. 提 ...

  6. POJ 1279 Art Gallery 半平面交 多边形的核

    题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...

  7. POJ 3761:Bubble Sort——组合数学

    题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法 ...

  8. Tiling 简单递推+大数

    Tiling c[0]=1,c[1]=1,c[2]=3;   c[n]=c[n-1]+c[n-2]*2;   0<=n<=250.   大数加法 java  time  :313ms 1 ...

  9. Spring-Redis缓存业务优化(通配符删除、两种自定义缓存时长)

    application.yml配置 spring:    cache:     type: REDIS     redis:       time-to-live: PT300S # 默认缓存秒数   ...

  10. swing设置观感

    1.先获取当前系统支持的观感样式 1 UIManager.LookAndFellInfo[] infos = UIManager.getInstalledLookAndFeels(); 2 3 Str ...