【题解】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 ...
随机推荐
- C# 连接数据操作的时候抛异常,连接超时
先说说我的业务.我在发送优惠券的时候,同时给6千多个会员发送优惠券,执行了update 和insert语句,这写语句都是通过字符串拼接而来的.update和insert语句加起来一共是一万多条语句.在 ...
- bokeh 中 ValueError: Unrecognized range input: 解决方法
bokeh_data.index =bokeh_data.index.astype(np.str) 将其转换为字符型
- MySQL数据库(五)--用户管理、pymysql模块
一.用户管理(权限管理) 在MySQL中自带的mysql数据库中有4个表用于用户管理的 # 优先级从高到低 user > db > tables_priv > columns_pri ...
- ARM开发板上查看动态库或者可执行程序的依赖关系
以ARM32开发板为例,在/lib下有一个名为ld-linux-armhf.so.3的可执行程序(在ARM64开发板上是/lib/ld-linux-aarch64.so.1),这个程序负责加载可执行程 ...
- 任务型对话(二)—— DST(对话状态追踪)
1,概述 关于任务型对话的简介看任务型对话(一)—— NLU(意识识别和槽值填充). 首先我们来看下对话状态和DST的定义. 对话状态:在$t$时刻,结合当前的对话历史和当前的用户输入来给出当前每个s ...
- Celery详解(1)
在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...
- 用Python玩转微信
Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io ...
- qt 断点无效
点击 工具 -->选项-->构建套件-->手动设置项,选择正确的编译器和调试器.
- 《浅谈我眼中的express、koa和koa2》好文留存+笔记
原文 :三英战豪强,思绪走四方.浅谈我眼中的express.koa和koa2 一.回调大坑怎么解决呢? 1.es5可以利用一下第三方库,例如 async 库, 2.或者单纯使用 connect中间件 ...
- 数据结构——单链表(singly linked list)
/* singlyLinkedList.c */ /* 单链表 */ /* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. */ #include <stdio ...