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

洛谷 P4284 [SHOI2014]概率充电器 解题报告的更多相关文章

  1. 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP

    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...

  2. Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)

    题面 Bzoj 洛谷 题解 首先考虑从儿子来的贡献: $$ f[u]=\prod_{v \in son[u]}f[v]+(1-f[v])\times(1-dis[i]) $$ 根据容斥原理,就是儿子直 ...

  3. P4284 [SHOI2014]概率充电器

    P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...

  4. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  5. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  8. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  9. P4284 [SHOI2014]概率充电器 dp

    这个题题干说的不清楚,一开始我以为只能是旁边紧挨着的传火,导致我一开始根本不知道哪错了.后来,我想到树形dp,但是需要正反考虑,()既要考虑父亲,又要考虑儿子),互相都有影响,所以没太想出来.后来知道 ...

随机推荐

  1. 20155204 王昊《网络对抗技术》EXP2 后门原理与实践

    20155204 王昊<网络对抗技术>EXP2 后门原理与实践 一.实验内容 准备工作(试用ncat.socat) 1. 使用netcat获取主机操作Shell,cron启动. 明确目标: ...

  2. 20155210 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 SET工具建立冒名网站 首先利用lsof -i:80或者netstat -tupln |grep 80查询80端口的使用情况(我的电脑80端口没有被占用,如果被占用,则用kil ...

  3. 2017-2018-2 20155224『网络对抗技术』Exp5:MSF基础应用

    基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传送到靶机中,我觉得老师上课举的火箭和卫星的例子非常形象,火箭只是 ...

  4. 20155302《网络对抗》Exp5 MSF基础应用

    20155302<网络对抗>Exp5 MSF基础应用 实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如 ...

  5. 20155320 EXP8 Web基础

    20155320 EXP8 Web基础 [基础问题回答] 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等 ...

  6. 20155325 Exp7 网络欺诈防范

    实践内容(3.5分) 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof ...

  7. python基础学习1-流程控制和判断

    python for循环和 if流程控制用法 Ages=22 for i in range(10): inputAges = int(input("输入年龄")) if input ...

  8. maven常用命令集

    maven常用命令 mvn compile  编译主程序源代码,不会编译test目录的源代码.第一次运行时,会下载相关的依赖包,可能会比较费时间. mvn test-compile  编译测试代码,c ...

  9. Security3: 架构和权限

    架构(Schema)是数据库对象(比如,Table,View,存储过程等)的容器,授予用户对Schema访问的权限,就是授予用户对Schema下所有object的访问权限. 一,架构(Schema)是 ...

  10. 虚拟机console最小化安装操作系统图文

    1. 概述2. 安装操作系统2.1 交互界面2.2 内核镜像解压等初始化2.3 磁盘发现2.4 硬件支持告警3. 开始安装3.1 语言选择3.2 键盘选择3.3 服务器类型3.4 配置主机名3.5 时 ...