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. 20155211 网络攻防技术 Exp7 网络欺诈防范

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

  2. 一段程序的分析——C++析构器,何时析构

    最近在看小甲鱼的视频,有段程序是这么写的: #include <iostream> #include <string> class Pet { public: Pet(std: ...

  3. python 画圆

    import numpy as np import matplotlib.pyplot as plt # ========================================== # 圆的 ...

  4. GIT命令基本使用

    记录摘选自廖雪峰的官方网站归纳总结 1.centos下安装git [root@cdw-lj ~]# yum install git 2.配置用户名以及邮箱 [root@cdw-lj opt]# git ...

  5. WebService技术,服务端and客户端JDK-wsimport工具(一)

    使用webservice服务,需要了解几个名词:soap 简单对象协议.http+xml . WSDL 先看下代码结构: 服务端代码与客户端代码分别处于两不同的包中 一.服务端内容 服务端: @Web ...

  6. Selenium和TestNG

    本文档由Felipe Knorr Kuhn撰写,并根据其博客上发布的一系列文章进行改编. 建模您的测试用例 在编写测试用例之前,您需要知道如何验证以及将要验证的内容.让我们使用WordPress “创 ...

  7. Catlike学习笔记(1.1)-使用Unity实现一个钟表

    最近发现『Catlike系列教程』觉得内容真的很赞,感觉有很多地方涉及到了我的知识盲点,如果真的可以照着做下来一遍的话应该收获颇丰.因为教程很长所以逐字翻译不太可能了(主要是翻译的太差).基本上就是把 ...

  8. java锁经典示例——卖车票场景

    场景:20张车票 3个窗口同时售票 1.不加锁 package com.yao.lock; /** * 不加锁的情况 */ public class Runnable_demo implements ...

  9. 20135202闫佳歆--week7 可执行程序的装载--学习笔记

    此为个人学习笔记存档 week 7 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 可执行文件的创建--预处理.编译和链接 cd Code vi hello.c gcc -E -o hell ...

  10. Linux内核分析(第三周)

    构造一个简单的linux系统menuOS. 一.简介 1.两把宝剑:中断-上下文的切换(保存现场和恢复现场) 进程-上下文的切换 2.linux-3.18.6 arch/x86目录下的代码是我们重点关 ...