【题解】Luogu P4284 [SHOI2014]概率充电器
原题传送门
我们知道,每个电器充电对充电电器数的贡献都是相等的1,所以若第\(i\)个电器有\(p_i\)的概率充电时
$$E=\sum_{i=1}^np_i$$
我们考虑如何求\(p_i\),根据树形dp的套路,肯定是自己子树的贡献和非自己子树贡献的结合
设\(f_i\)表示自己及自己的子树不能给自己充电的概率,\(g_i\)表示非子树节点和自己不能给自己充电的概率,易知
$$p_i=1-f_ig_i$$
我们考虑如何求\(f_i\),\(g_i\)
对于\(f_i\):
$$f_i=(1-direct_i)\prod_{v \in son_i}(f_v+(1-f_v)(1-edge[i->v].p))$$
解释一下:首先要自己不直接通电,然后任意一个儿子要么不通电,要么通电且与自己的电线不通
对于\(g_i\)
设$$tmp=\frac{g_{fa}f_{fa}}{f_i+(1-f_i)(1-edge[fa->i].p)}$$
则$$g_i=tmp+(1-tmp)*(1-edge[fa->i].p)$$
\(tmp\)表示除了自己和自己的子树通电,自己父亲通电的概率。那么从非子树和自己来的电就是父亲不通电的概率与父亲通电但自己与父亲电线不通的概率之和
注意:题目给的是百分数,要处以\(100.0\);我们拟定\(1\)为根节点,所以初始条件为\(g_1=1\)
#include <bits/stdc++.h>
#define db double
#define N 500005
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
struct edge{
int to,next;
db w;
}e[N<<1];
int head[N],cnt=0;
inline void add(register int u,register int v,register db w)
{
++cnt;
e[cnt].to=v,e[cnt].next=head[u],e[cnt].w=w;
head[u]=cnt;
}
int n;
db a[N],g[N],f[N],ans;
inline void dfs1(register int x,register int fa)
{
f[x]=1.0-a[x];
for(register int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa)
continue;
dfs1(v,x);
f[x]*=f[v]+(1.0-f[v])*(1.0-e[i].w);
}
}
inline void dfs2(register int x,register int fa)
{
for(register int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa)
continue;
double tmp=g[x]*f[x]/(f[v]+(1.0-f[v])*(1.0-e[i].w));
g[v]=tmp+(1.0-tmp)*(1.0-e[i].w);
dfs2(v,x);
}
}
int main()
{
n=read();
for(register int i=1;i<n;++i)
{
int u=read(),v=read(),w=read();
add(u,v,w/100.0),add(v,u,w/100.0);
}
for(register int i=1;i<=n;++i)
{
int x=read();
a[i]=x/100.0;
}
dfs1(1,0);
g[1]=1.0;
dfs2(1,0);
for(register int i=1;i<=n;++i)
ans+=(1.0-g[i]*f[i]);
printf("%.6lf",ans);
return 0;
}
【题解】Luogu P4284 [SHOI2014]概率充电器的更多相关文章
- luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp
LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- P4284 [SHOI2014]概率充电器
P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...
- P4284 [SHOI2014]概率充电器 dp
这个题题干说的不清楚,一开始我以为只能是旁边紧挨着的传火,导致我一开始根本不知道哪错了.后来,我想到树形dp,但是需要正反考虑,()既要考虑父亲,又要考虑儿子),互相都有影响,所以没太想出来.后来知道 ...
- Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)
题面 Bzoj 洛谷 题解 首先考虑从儿子来的贡献: $$ f[u]=\prod_{v \in son[u]}f[v]+(1-f[v])\times(1-dis[i]) $$ 根据容斥原理,就是儿子直 ...
- Luogu 4284 [SHOI2014]概率充电器
BZOJ 3566 树形$dp$ + 概率期望. 每一个点的贡献都是$1$,在本题中期望就等于概率. 发现每一个点要通电会在下面三件事中至少发生一件: 1.它自己通电了. 2.它的父亲给它通电了. 3 ...
- 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 ...
随机推荐
- 剑指:最小的k个数
题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...
- Linux下getopt()函数
from https://www.cnblogs.com/qingergege/p/5914218.html 最近在弄Linux C编程,本科的时候没好好学啊,希望学弟学妹们引以为鉴. 好了,虽然啰嗦 ...
- 使用 Python 生成二维码
在“一带一路”国际合作高峰论坛举行期间, 20 国青年投票选出中国的“新四大发明”:高铁.扫码支付.共享单车和网购.其中扫码支付指手机通过扫描二维码跳转到支付页面,再进行付款.这种新的支付方式,造就二 ...
- PHP如何创建文件夹(mkdir的用法,mkdirs的语法)【转】
(PHPmkdir如何创建多级目录) 在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其它不是那样,单个的MKDIR只能创建一级目录,对于多级的就不 ...
- svn更换repos时保留svn log
两种情况 1. 直接移动库 问题:svn如何把A服务器上的reposA上传到B服务器的reposB并保留各种上传更新记录? 这个问题要感想敢干,直接复制改名即可 #登录到B服务器 scp -r cmo ...
- 两个概念:CCA和LDA
典型相关性分析(CCA) https://blog.csdn.net/Mbx8X9u/article/details/78824216 典型关联分析(Canonical Correlation Ana ...
- javascript之DOM(一节点类型Node)
DOM(Document Object Model)是针对HTML和XML文档的一个API.DOM描述的是一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分.起源于DHML,现为W3C的推 ...
- webUploader大文件断点续传学习心得 多文件
二.Jsp代码: <!-- 断点续传 start--> <!-- 隐藏域 实时保存上传进度 --> <input id="jindutiao" t ...
- 1. 观察者模式总结(C++)
1. 介绍 观察者模式:定义了一种"一对多"的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象.观察者模式属于行为模式. ...
- axios跨域处理
本质分析: 因为axios在vue中利用中间件http-proxy-middleware做了一个本地的代理服务A,相当于你的浏览器通过本地的代理服务A请求了服务端B,浏览器通过服务A并没有跨域,因此就 ...