2018.08.31 bzoj3566: [SHOI2014]概率充电器(概率dp+容斥原理)
传送门
概率dp好题啊。
用f[i]" role="presentation" style="position: relative;">f[i]f[i]表示i自己不亮并且子树中的节点不会让i亮的概率。
用g[i]" role="presentation" style="position: relative;">g[i]g[i]表示i的子树以外的连通块不会使i变亮的概率。
貌似f[i]" role="presentation" style="position: relative;">f[i]f[i]可以直接推出来啊:
f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))" role="presentation" style="position: relative;">f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))。
g[i]" role="presentation" style="position: relative;">g[i]g[i]感觉有点难推啊。
有个坑点是我们在推g[i]的时候已经自动默认i为根的子树没亮了,因此要除一个f[i]。
然后就没啥了。
我们设一个临时变量tmp。
tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))" role="presentation" style="position: relative;">tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))
g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])" role="presentation" style="position: relative;">g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])
代码:
#include<bits/stdc++.h>
#define N 500005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,first[N],cnt=0;
double p[N],f[N],g[N];
struct edge{int v,next;double w;}e[N<<1];
inline void add(int u,int v,double w){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].w=w,first[u]=cnt;}
inline void dfs1(int x,int fa){
f[x]=1-p[x];
for(int i=first[x];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
dfs1(v,x),f[x]*=f[v]+(1-f[v])*(1-e[i].w);
}
}
inline void dfs2(int x,int fa){
if(x==1)g[x]=1;
for(int i=first[x];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
double tmp=g[x]*f[x]/(f[v]+(1-f[v])*(1-e[i].w));
g[v]=tmp+(1-tmp)*(1-e[i].w);
dfs2(v,x);
}
}
int main(){
n=read();
for(int i=1;i<n;++i){
int u=read(),v=read();
double w=read()*1.0/100;
add(u,v,w),add(v,u,w);
}
for(int i=1;i<=n;++i)p[i]=read()*1.0/100;
dfs1(1,0),dfs2(1,0);
double ans=0;
for(int i=1;i<=n;++i)ans+=1-g[i]*f[i];
printf("%.6lf",ans);
return 0;
}
2018.08.31 bzoj3566: [SHOI2014]概率充电器(概率dp+容斥原理)的更多相关文章
- 2018.08.31 bzoj1426 收集邮票(期望dp)
描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所以 ...
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...
- BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!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一次考虑节 ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- [BZOJ3566][SHOI2014]概率充电器(概率DP)
题意:树上每个点有概率有电,每条边有概率导电,求每个点能被通到电的概率. 较为套路但不好想的概率DP. 树形DP肯定先只考虑子树,自然的想法是f[i]表示i在只考虑i子树时,能有电的概率,但发现无法转 ...
- BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)
BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...
- luoguP4284 [SHOI2014]概率充电器 概率期望树形DP
这是一道告诉我概率没有想象中那么难的题..... 首先,用期望的线性性质,那么答案为所有点有电的概率和 发现一个点的有电的概率来源形成了一个"或"关系,在概率中,这并不好计算... ...
随机推荐
- linux 下常用部分命令
关机 (系统的关机.重启以及登出 ) shutdown -h now 关闭系统() init 关闭系统() shutdown -h hours:minutes & 按预定时间关闭系统 shut ...
- myeclipse2016-ci破解疑难杂症问题整理
感谢网上的各位大神,在你们的基础,我又整理了下安装成功的心得,破解不成功时一定注意下红色字体内容,避免被坑,都是教训. 试了网上N种破解工具+方法,Myeclipse 2016装了很多遍(本人官网下载 ...
- Activity服务类-8 RuntimeService服务类
一共89个接口1.启动流程实例(20个方法)//使用给定的键在流程定义的最新版本中启动一个新的流程实例.ProcessInstance startProcessInstanceByKey(String ...
- Spring在代码中获取properties文件属性
这里介绍两种在代码中获取properties文件属性的方法. 使用@Value注解获取properties文件属性: 1.因为在下面要用到Spring的<util />配置,所以,首先要在 ...
- How to Pronounce INTERNATIONAL
How to Pronounce INTERNATIONAL Share Tweet Share Tagged With: Dropped T How do you pronounce this lo ...
- python格式化输出(转)
在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...
- IntelliJ IDEA教程
http://www.jetbrains.com/help/idea/meet-intellij-idea.html
- EasyUI 删除
<script type="text/javascript"> <!-- js --> /*================================ ...
- Interface, 接口的实现初解
百度是这么说的: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 两种含 ...
- python之字符串【str】
#Auther Bob#--*--conding:utf-8 --*-- #定义一个str的对象,有下面两种方法name = 'Bob abc'job = str('it')print(type(na ...