洛谷 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的更多相关文章

  1. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

  2. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

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

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

  4. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  5. BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)

    BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...

  6. [SHOI2014]概率充电器(概率+换根dp)

    著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品 ...

  7. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  8. 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)

    题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...

  9. 【洛谷1654/BZOJ4318】OSU!(期望DP)

    题目: 洛谷1654 分析: 本人数学菜得要命,这题看了一整天才看明白-- 先说说什么是"期望".不太严谨地说,若离散型随机变量(可以看作"事件")\(X\)取 ...

随机推荐

  1. luogu P4887 模板 莫队二次离线 莫队 离线

    LINK:模板莫队二次离线 很早以前学的知识点 不过 很久了忘了. 考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个. 不 ...

  2. angular2+ 组件间通信

    angular2+ 不同于react的redux,vue的vuex,angular2+其实可实现数据状态管理的方法很多,以下方案一般也足够支撑普通业务: 父子组件通信 1.1 父组件向子组件传递信息( ...

  3. linux集群服务网络状态(netstat),服务端页面(图形字符页面)基本配置

    Linux网络基础配置 yum -y install vim        安装vim 关闭的防火墙服务 iptables -F iptables -X iptables -Z systemctl s ...

  4. TF上架模式是什么?有什么作用?

    TF上架模式中的TF上架就是TestFlight上架的意思,意思就是将开发者开发完成的App在苹果官方内测商店TestFlight上架的模式,一般被我们简称为TF上架模式. 为什么要了解TF上架呢?为 ...

  5. CSS-flex|gird 布局

    网页布局.css *{ box-sizing: border-box; } /* flex弹性布局 */ #flex-container { display: flex; flex-direction ...

  6. 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

    自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...

  7. C#LeetCode刷题之#541-反转字符串 II(Reverse String II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3951 访问. 给定一个字符串和一个整数 k,你需要对从字符串开头 ...

  8. C#LeetCode刷题之#441-排列硬币(Arranging Coins)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3995 访问. 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状 ...

  9. Vue element-ui el-table阻止行选事件

    我们经常会在某个table末尾加上操作列来放置button来处理跳转和其他的逻辑 那么当点击button的时候同样也会执行在el-table 设置的 @row-click="handleRo ...

  10. Centos系统安装Python3.7

    服务器安装Python3.7,实测可用 原博客地址 首先要先安装依赖包: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel ...