[SHOI2014]概率充电器 题解
注意到本题的贡献是不带权的,所以期望其实就是每个点的概率之和。
本题正着做好像不是很好做,要考虑 \(P(A+B)=P(A)+P(B)-P(A)P(B)\) 的容斥(因为这是两个条件至少满足一个,所以是求集合并的概率),具体可以看这个。
所以我们考虑反着做。设 \(f_u\) 表示 \(u\) 点没有通电的概率,那么有
\]
这个点先要自己不亮,然后周围的点要么边不导电,要么边导电但链接的那个不通电,注意到后面那个其实算的是 \(P(A)+P(A|B)\)。
发现有后效性,我们考虑换根 DP,重新设 \(f_u\) 表示只考虑在 \(u\) 的子树中的点使得 \(u\) 不亮的概率,于是刚才的式子变成了
\]
第一遍 DP 后根的答案已经正确了,考虑从 \(fa\) 推向 \(u\),设 \(g_u\) 是根为 \(u\) 时的答案。有
\]
注意要判断除数为 \(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]概率充电器 题解的更多相关文章
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- BZOJ3566: [SHOI2014]概率充电器 树形+概率dp
3566: [SHOI2014]概率充电器 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1888 Solved: 857[Submit][Stat ...
- 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP
[BZOJ3566][SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线 ...
- BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ 3566: [SHOI2014]概率充电器( 树形dp )
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- P4284 [SHOI2014]概率充电器
P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ3566 SHOI2014 概率充电器 【概率DP】
BZOJ3566 SHOI2014 概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能 ...
随机推荐
- 用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue
前言 用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的.当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容.回 ...
- Docker与k8s的恩怨情仇(一)—成为PaaS前浪的Cloud Foundry
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 大家在工作中或许或多或少都接触过Docker,那你知道Docker以及容器化背后的原理到底是什么吗? 容器化 ...
- CLR里的MethodTable,MethodDescChunk,MethodDesc,FixUpPreCode都是什么意思
一:看下面一些概念 1MethodTable MethodTable可以说在CLR里面无处不在,这个东西主要是作为对象的数据类型存在,主要包含了EEClass 模块地址,类型名称,模块路径等. 2.E ...
- Java持久层框架Mybatis入门
MyBatis是什么 MyBatis是Java的持久层框架,GitHub的star数高达15.8k,是Java技术栈中最热门的ORM框架之一.它支持自定义SQL.存储过程以及高级映射,可以通过XML或 ...
- NOIP模拟测试9「随·单·题」
liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...
- 『无为则无心』Python基础 — 14、Python流程控制语句(while循环语句)
目录 1.什么是循环结构 2.while循环 (1)while循环的语法 (2)while循环的应用 3.while语句的死循环 4.break和continue 5.while循环嵌套 (1)应用场 ...
- Linux中ls的用法
在linux系统中,可以说一切皆文件.文件类型包含:普通文件,目录,字符设备文件,块设备文件,符号链接文件等 我们可以用file这个命令来查看文件的属性: 这里可以看到1.sh是个脚本文件 下面开始介 ...
- 『无为则无心』Python序列 — 23、Python序列的公共API
目录 1.运算符 @1.+加号 @2.*乘号 @3.in或not in 2.公共方法 @1.len()方法 @2.del和del() @3.max()方法 @4.min()方法 @5.range() ...
- hdu 6048 Puzzle 拼图 逆序数
关于拼图和逆序数的关系可以看看这个 http://www.guokr.com/question/579400/ 然后求逆序数在判断就行了 按题意生成原始排列,观察发现,每一轮数后方比该数小的数的数量( ...
- Vector ArrayList LinkedList
三者都实现了List接口! Vector与ArrayList:采用顺序存储的方式,但是Vector是线程安全的,ArrayList是线程不安全的,按需使用: 当存储空间不足的时候,ArrayList默 ...