洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
题目描述
著名的电子产品品牌\(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\) 位小数。
输入输出样例
输入 #1复制
3
1 2 50
1 3 50
50 0 0
输出 #1复制
1.000000
输入 #2复制
5
1 2 90
1 3 80
1 4 70
1 5 60
100 10 20 30 40
输出 #2复制
4.300000
说明/提示
对于\(30\%\)的数据,\(n≤5000\)。
对于\(100\%\)的数据,\(n≤500000,0≤p,q_i≤100\)。
分析
对于一个元件,它可以被与它相邻的多个元件所影响
如果我们想要一次求出所有的结果,\(DP\)的顺序是不好规定的
因此我们可以先随便选一个点作为根节点,求出每一个点自己点亮自己和被子树点亮的概率
这样选定的根节点求出的结果是正确的
我们就可以继续使用换根\(DP\)求出其他的值
如果求被点亮的概率转移比较麻烦,因此我们设\(f[i]\)为\(i\)不被点亮的概率
那么\(f[i]=(1.0-val[i,j]+val[i,j] \times f[j])\),\(j\)是\(i\)的儿子节点
如果\(i\)和\(j\)之间的边都没有通电,那么\(i\)被\(j\)点亮肯定是不可以的
即使边通了电,也要保证\(j\)通电才可以
换根的时候,我们定义\(g[i]\)为节点\(i\)通电的概率
对于之前的根节点,直接继承即可
对于其它任意一个节点\(i\),如果我们要更新儿子节点\(j\)的话
我们首先把\(j\)所在子树的价值从\(i\)中刨去
再用得到的值去更新\(g[j]\)即可
代码
#include<cstdio>
#include<cstring>
const int maxn=1e6+5;
int head[maxn],tot=1,n;
struct asd{
int to,next;
double val;
}b[maxn];
void ad(int aa,int bb,int cc){
b[tot].to=bb;
b[tot].next=head[aa];
b[tot].val=(double)cc*0.01;
head[aa]=tot++;
}
double f[maxn],p[maxn],g[maxn];
void dfs(int now,int fa){
f[now]=p[now];
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
dfs(u,now);
f[now]*=(1.0-b[i].val+b[i].val*f[u]);
}
}
void dfs2(int now,int fa,double lat){
if(now==1){
g[now]=f[now];
} else {
double P=g[fa]/(1.0-lat+lat*f[now]);
g[now]=f[now]*(1.0-lat+lat*P);
}
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(u==fa) continue;
dfs2(u,now,b[i].val);
}
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<n;i++){
int aa,bb,cc;
scanf("%d%d%d",&aa,&bb,&cc);
ad(aa,bb,cc);
ad(bb,aa,cc);
}
for(int i=1;i<=n;i++){
int aa;
scanf("%d",&aa);
p[i]=1.0-(double)aa*0.01;
}
dfs(1,0);
dfs2(1,0,0);
double ans=0;
for(int i=1;i<=n;i++){
ans+=(1.0-g[i]);
}
printf("%.6f\n",ans);
return 0;
}
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP的更多相关文章
- bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp
题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)
题面 Bzoj 洛谷 题解 首先考虑从儿子来的贡献: $$ f[u]=\prod_{v \in son[u]}f[v]+(1-f[v])\times(1-dis[i]) $$ 根据容斥原理,就是儿子直 ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)
BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...
- [SHOI2014]概率充电器(概率+换根dp)
著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品 ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
- 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)
题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...
- 【洛谷1654/BZOJ4318】OSU!(期望DP)
题目: 洛谷1654 分析: 本人数学菜得要命,这题看了一整天才看明白-- 先说说什么是"期望".不太严谨地说,若离散型随机变量(可以看作"事件")\(X\)取 ...
随机推荐
- Django学习路13_创建用户登录,判断数据库中账号名密码是否正确
在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...
- PHP 数据库 ODBC创建 ODBC 连接
PHP 数据库 ODBC ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数 ...
- MB2-718 Certification: (Microsoft Dynamics 365 Customer Service) – Field Service, Customer Assets
Come from : https://neilparkhurst.com/2018/02/25/mb2-718-certification-microsoft-dynamics-365-custom ...
- 【CSP2019】括号树 题解(递推+链表)
前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...
- [vue] computed 和 method
计算属性 计算属性只有在它的相关依赖发生改变时才会重新取值 Method method每次渲染的时候都会被执行 举一个栗子 <template>...<div> <p& ...
- Mybitis根据工具类反射数据库生成映射+整合springboot
一 反向生成数据库mapper的工具类: 添加依赖 <dependency> <groupId>org.mybatis.generator</groupId> &l ...
- Chrome简洁高效管理下载项
每次要查看下载记录时,Chrome新建下载标签页的速度能让我抓狂 之前用的 Chrono 界面太过传统,而且还不能点击打开.所以一直在寻找好用的下载管理插件,经过多次在拓展商城搜索比对,找到了这款拓展 ...
- CentOS7安装MinIO教程,并在C#客户端WPF中实现监控上传进度
MinIO的详细介绍可以参考官网(https://min.io/product/overview). 简单来说它是一个实现了AWS S3标准的100%开源的,可商用的( Apache V2 licen ...
- Mysql Column 'xxxxx' in field list is ambiguous"
使用了关联查询,两张表有相同的字段,所以说取值含糊不清: 使用别名.列名解决: 如 a.description
- Nginx定时日志切割
Nginx定时日志切割 现有的日志都会存在access.log文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维 人员查看,所以我们可以通过把这个大的日志文件切割为多份不 ...