P4284 [SHOI2014]概率充电器
P4284 [SHOI2014]概率充电器
今天上课讲到的题orz,第一次做这种上下搞两次dp的题。
g[i]表示i的子树(包括i)不给i充电的概率。
f[i]表示i的父亲不给i充电的概率。
g[]可以快速求出来。h[i]表示i对i父亲的贡献,则
\(h_i=g_i+(1-g_i)(1-w(i,fa_i))\)
\(g_i=(1-q_i)\Pi_{j=son}h_j\)
\(w(i,fa_i)\)即\(i\)与\(fa_i\)之间路径的长度。
但是f[]就不好求了= =

上面已经求出了f[y],要求f[x]。f[x]需要计算除了x的子树之外的所有点。
可以把这些点分成两部分:绿色和紫色部分
紫色部分就是f[y],但绿色呢?
回去看一眼:\(g_y=(1-q_y)\Pi_{j=son}h_j\)
所以只需要除掉\(h_x\)就星了。
\(t=\frac{g_yf_y}{h_x}\)
\(f_x=t+(1-t)(1-w(x,y))\)
注意t不是\(f_x\),t是去掉x子树后y通电的概率,可参照h的求法
上述方法可获得95分的好成绩。
因为\(t=\frac{g_yf_y}{h_x}\),如果遇到0就GG了。。。
观察一下,\(h_x=0\)的话,t实际是0(因为上面一定会通电下来??
然后写完了= =
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
using namespace std;
typedef int mmp;
#define vd void
#define rg register
#define il inline
#define sta static
il int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=500001;
int id,fir[maxn],nxt[maxn<<1],dis[maxn<<1],w[maxn<<1];
int p[maxn];
il vd link(int x,int y,int z){nxt[++id]=fir[x],fir[x]=id,dis[id]=y,w[id]=z;}
double f[maxn],g[maxn],h[maxn];
il vd dp(int x,int fa=-1){
g[x]=1-p[x]*.01;
for(rg int i=fir[x];i;i=nxt[i]){
if(fa==dis[i])continue;
dp(dis[i],x);
h[dis[i]]=g[dis[i]]+(1-g[dis[i]])*(1-w[i]*.01);
g[x]*=h[dis[i]];
}
}
il vd dp2(int x,int fa=-1){
for(rg int i=fir[x];i;i=nxt[i]){
if(fa==dis[i])continue;
double t=(h[dis[i]]<1e-6)?0:g[x]*f[x]/h[dis[i]];
f[dis[i]]=t+(1-t)*(1-w[i]*.01);
dp2(dis[i],x);
}
}
mmp main(){
// freopen("4284.in","r",stdin);
// freopen("4284.out","w",stdout);
int n=gi();
for(rg int i=1;i<n;++i){
sta int a,b,p;
a=gi(),b=gi(),p=gi();
link(a,b,p),link(b,a,p);
}
for(rg int i=1;i<=n;++i)p[i]=gi();
dp(1);f[1]=1;dp2(1);
double ans=0;
for(rg int i=1;i<=n;++i)ans+=1-f[i]*g[i];
printf("%.6lf\n",ans);
// for(rg int i=1;i<=n;++i)printf("%.6lf ",f[i]);puts("");
// for(rg int i=1;i<=n;++i)printf("%.6lf ",g[i]);puts("");
// for(rg int i=1;i<=n;++i)printf("%.6lf ",h[i]);puts("");
return 0;
}
P4284 [SHOI2014]概率充电器的更多相关文章
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...
- P4284 [SHOI2014]概率充电器 dp
这个题题干说的不清楚,一开始我以为只能是旁边紧挨着的传火,导致我一开始根本不知道哪错了.后来,我想到树形dp,但是需要正反考虑,()既要考虑父亲,又要考虑儿子),互相都有影响,所以没太想出来.后来知道 ...
- luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp
LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...
- Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)
题面 Bzoj 洛谷 题解 首先考虑从儿子来的贡献: $$ f[u]=\prod_{v \in son[u]}f[v]+(1-f[v])\times(1-dis[i]) $$ 根据容斥原理,就是儿子直 ...
- 【题解】Luogu P4284 [SHOI2014]概率充电器
原题传送门 我们知道,每个电器充电对充电电器数的贡献都是相等的1,所以若第\(i\)个电器有\(p_i\)的概率充电时 \[E=\sum_{i=1}^np_i\] 我们考虑如何求\(p_i\),根据树 ...
- 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
3566: [SHOI2014]概率充电器 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1888 Solved: 857[Submit][Stat ...
随机推荐
- 使用uwsgi发布项目
1.先下载 uwsgi 指定豆瓣源下载 pip install -i https://pypi.douban.com/simple uwsgi 2.查看你的uwsgi基于那个python解释器运行的 ...
- REST Framework 的用户认证组件
用户认证流程: 我们要知道这个流程是怎么走的? 认证之后做的什么? 怎么认证?这三个条件 认证流程:就是使用BaseAuthentication这个模块来做认证,判断你登陆成功传递过来的随机字符串是否 ...
- WinPE ISO制作
1.安装ADK,然后导出winPE镜像文件和启动文件: 打开 部署和映像工具环境,cd "Windows Preinstallation Environment",运行 copyp ...
- python---九九乘法表代码
#_*_ coding:utf-8 _*_# author choco ''' #while循环num1=0while num1<9: num1+=1 num2=1 while num2< ...
- ASP.NET Web Api vs Node.js Benchmark
http://mikaelkoskinen.net/post/asp-net-web-api-vs-node-js-benchmark ASP.NET Web Api vs Node.js Bench ...
- 用windows自带的fsutil修改稀疏文件大小成功,但文件内容似乎丢失
fsutil sparse setflag. fsutil sparse setrange 10M对应字节,1G对应字节.. 看文件属性,实际尺寸是小了,但内容似乎也丢了..因为自己把该文件做成虚拟盘 ...
- 【洛谷】【堆+模拟】P2278 操作系统
from HNOI2003 [题目描述:] 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则 ...
- mongodb的学习-4-使用 MongoDB shell 来连接 Mongodb 服务
执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接的建立,当连接被建立后,就会开始打印日志信息. 使用 MongoDB shell 来连接 Mongodb 服务 标准 ...
- Kafka设计解析(七)Kafka Stream
转载自 技术世界,原文链接 Kafka设计解析(七)- Kafka Stream 本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka ...
- Spring源码分析(六)解析和注册BeanDefinitions
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 当把文件转换为Document后,接下来的提取及注册bean就是我们的重 ...