洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器
题目描述
著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器:
“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看 吧!”
SHOI 概率充电器由 \(n-1\) 条导线连通了 \(n\) 个充电元件。进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定。随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行 间接充电。
作为 SHOI 公司的忠实客户,你无法抑制自己购买 SHOI 产品的冲动。在排了一个星期的长队之后终于入手了最新型号的 SHOI 概率充电器。你迫不及待地将 SHOI 概率充电器插入电源——这时你突然想知道,进入充电状态的元件个数的期望是多少呢?
输入输出格式
输入格式:
第一行一个整数:\(n\)。概率充电器的充电元件个数。充电元件由 \(1-n\) 编号。
之后的 \(n-1\) 行每行三个整数\(a,b,p\) ,描述了一根导线连接了编号为 \(a\) 和 \(b\) 的 充电元件,通电概率为\(p\%\)。
第 \(n+2\) 行 \(n\) 个整数:\(q_i\)。表示 \(i\) 号元件直接充电的概率为 \(q_i\%\)。
输出格式:
输出一行一个实数,为能进入充电状态的元件个数的期望,四舍五入到小数点后6位小数。
说明
对于\(30\%\)的数据,\(n≤5000\)。
对于\(100\%\)的数据,\(n≤500000\),\(0≤p,q_i≤100\)。
果然一做期望题就暴露自己脑子蠢的事实了=-=
首先我读错题了,但是我觉得不能怪我啊,难道题目说的不就是只有自己激发的才能传火给别人嘛...
然后我花了好久才发现这个题就是在算概率。
每个点可以从所有其他点获取传火概率,做一个换跟dp就行了,具体的
\(dp_i\)先处理出子树\(i\)的贡献,然后直接换跟做就可以了。
需要注意的地方,传火的时候要减去两个都有,换跟中有一个类似退背包的过程需要处理分母为0
Code:
#include <cstdio>
#include <cmath>
const int N=5e5+10;
const double eps=1e-8;
int head[N],to[N<<1],Next[N<<1],cnt;
double dp[N],ans,edge[N<<1];
void add(int u,int v,double w)
{to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
void dfs1(int now,int fa)
{for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa){dfs1(v,now);dp[now]=dp[now]+dp[v]*edge[i]-dp[now]*dp[v]*edge[i];}
}
void dfs2(int now,int fa,double p)
{dp[now]=dp[now]+p-dp[now]*p;ans+=dp[now];for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=fa){if(fabs(dp[v]*edge[i]-1)<eps) p=dp[now];else p=(dp[now]-dp[v]*edge[i])/(1-dp[v]*edge[i]);dfs2(v,now,p*edge[i]);}
}
int main()
{int n;scanf("%d",&n);for(int u,v,w,i=1;i<n;i++){scanf("%d%d%d",&u,&v,&w);add(u,v,1.0*w/100),add(v,u,1.0*w/100);}for(int i=1;i<=n;i++) scanf("%lf",dp+i),dp[i]/=100.0;dfs1(1,0);dfs2(1,0,0);printf("%.6lf\n",ans);return 0;
}
2019.1.13
转载于:https://www.cnblogs.com/butterflydew/p/10262582.html
洛谷 P4284 [SHOI2014]概率充电器 解题报告相关推荐
- 【洛谷】P4147 玉蟾宫 解题报告
[洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...
- 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...
- 「洛谷P1343」地震逃生 解题报告
P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...
- 洛谷 [SDOI2015]约数个数和 解题报告
[SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...
- 洛谷 CF1043F Make It One 解题报告
CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...
- 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 洛谷 P2389 电脑班的裁员 解题报告
题意: 给定一段长为N的序列,选取其中的至多M段使这些子段和最大. 当N=1000时,我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取 ...
- 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...
最新文章
- 深度学习Github排名,很不错的介绍
- 五个举措:现代化Jenkins 和终结“Jenkinsteins”
- git 忽略文件失效
- python函数大全和意思_python 之 内置函数大全
- 静态链接库与动态链接库
- ShuffleNet论文阅读笔记
- matlab自动排版,工具方法| Matlab 简单绘图与排版
- 上接扩展GridView控件(10) - 自定义分页样式
- java的jdk是什么_什么是jdk?
- 机器视觉硬件选型——镜头选型
- python的多行语句可以使用反斜杠_Python的续行符:反斜杠\
- win10安装kali组双系统
- layabox 打印_Layabox 集成指南
- 在线板涂鸦,微信小程序,绘画板,签字版,实现在线涂鸦画板小程序源码
- python3学习笔记---类
- postgres数据库表空间收缩之pg_squeeze,pg_repack
- T1118,T1677,T1122
- VC写的双人版俄罗斯方块
- 毕业季--写给大学毕业生的一番话
- 【Python】定时获取卫星地球图像作为电脑壁纸