题面

n <= 500000   0<= p,qi <= 100

题解

这是道概率树形DP题,但是很难推怎么用加法原理和乘法原理正向求每个点被充电的概率,所以我们求每个点不被充电的概率。

我们发现求不被充电的概率很好求。

dp[x][0] 表示x点不被x的子树(包括它自己)充电的概率,dp[x][1] 表示x点不被x的祖先充电的概率。

我们发现,这里面有除法,所以要判断是否为零,我们会发现,如果为零的话,那么dp[x][1]*dp[x][0]就肯定等于零,所以dp[x][1]可以取任意值,最后的答案也是对的。

CODE

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#define LL long long
#define MAXN 500005
using namespace std;
inline int read() {
int f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
struct ed{
int v;
double w;
ed(){v = 0;w = 0.0;}
ed(int V,double W){v = V;w = W;}
};
vector<ed> g[MAXN];
double dp[MAXN][2],a[MAXN];
int n,m,i,j,s,o,k,cnt;
void dfs(int x,int fa) {
dp[x][0] = (1.0 - a[x]);
// dp[x][0] = min(dp[x][0],1.0);
for(int i = 0;i < g[x].size();i ++) {
if(g[x][i].v != fa) {
dfs(g[x][i].v,x);
int y = g[x][i].v;
double w = g[x][i].w;
dp[x][0] *= (dp[y][0] + (1.0 - dp[y][0]) * (1.0 - w));
// dp[x][0] = min(dp[x][0],1.0);
}
}
return ;
}
void dfs2(int x,int fa,double edge) {
double t = (dp[x][0] + (1.0 - dp[x][0]) * (1.0 - edge));
if(t < 1e-6) t = 0;
else t = dp[fa][1] * dp[fa][0] / t;
dp[x][1] = t + (1.0 - t) * (1 - edge);
if(fa == x) dp[x][1] = 1.0;
// dp[x][0] = min(dp[x][0],1.0);
for(int i = 0;i < g[x].size();i ++) {
if(g[x][i].v != fa) {
dfs2(g[x][i].v,x,g[x][i].w);
}
}
return ;
}
int main() {
n = read();
for(int i = 1;i < n;i ++) {
s = read();o = read();
double p = read() / 100.0;
g[s].push_back(ed(o,p));
g[o].push_back(ed(s,p));
}
for(int i = 1;i <= n;i ++) {
a[i] = read() / 100.0;
}
dfs(1,1);
dfs2(1,1,0.0);
double ans = 0.0;
for(int i = 1;i <= n;i ++) {
ans += (1.0 - dp[i][0]*dp[i][1]);
}
printf("%.6f\n",ans);
return 0;
}

「SHOI2014」概率充电器的更多相关文章

  1. Loj #2192. 「SHOI2014」概率充电器

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

  2. 「SHOI2014」三叉神经树 解题报告

    「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...

  3. [LOJ 2190] 「SHOI2014」信号增幅仪

    [LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...

  4. 「SHOI2014」三叉神经树

    「SHOI2014」三叉神经树 给你一颗由\(n\)个非叶子结点和\(2n+1\)个叶子结点构成的完全三叉树,每个叶子结点有一个输出:\(0\)或\(1\),每个非叶子结点的输出为自己的叶子结点中较多 ...

  5. 【LOJ】#2187. 「SHOI2014」三叉神经树

    题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把 ...

  6. LOJ#2190. 「SHOI2014」信号增幅仪(最小圆覆盖)

    题面 传送门 题解 我连椭圆是个啥都不知道导致这么简单一道题我一点思路都没有-- 我们把坐标系旋转一下,让半长轴成为新的\(x\)轴,也就是说所有点都绕原点逆时针旋转\(360-a\)度,然后再把所有 ...

  7. 【BZOJ】3566: [SHOI2014]概率充电器

    [算法]树型DP+期望DP [题意]一棵树上每个点均有直接充电概率qi%,每条边有导电概率pi%,问期望有多少结点处于充电状态? [题解]引用自:[BZOJ3566][SHOI2014]概率充电器 树 ...

  8. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...

  9. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

随机推荐

  1. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  2. camunda开源流程引擎的数据库表结构介绍

    Camunda bpm流程引擎的数据库由多个表组成,表名都以ACT开头,第二部分是说明表用途的两字符标识.本文以Camunda7.11版本为例,共47张表. ACT_RE_*: 'RE'表示流程资源存 ...

  3. 28.MysQL的日志管理及备份与恢复

    MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...

  4. 22.LVS+Keepalived 高可用群集

    LVS+Keepalived 高可用群集 目录 LVS+Keepalived 高可用群集 keepalived工具介绍 Keepalived实现原理剖析 VRRP(虚拟路由冗余协议) VRRP 相关术 ...

  5. SAP Drag or drop tree

    1 *&---------------------------------------------------------------------* 2 *& Report RSDEM ...

  6. <%= %> <%- %> <% %>是什么意思?

    .ejs文件后缀的数据渲染,这是服务器端的.把 .html改成 .ejs, (1)<%= %>相当于html中的innerTEXT,导出不包含标签 . (2)<%- %>相当于 ...

  7. 【RPA之家转载】苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据、合同处理自动化

    [RPA之家转载]苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据.合同处理自动化 看到大会的主题,说每一位开发者都了不起,说白了我也非常的感触,因为我自己本身也是一个开发者,我从01 ...

  8. go统计字符串及数组中出现次数

    数组:统计出现字数 package main import "fmt" func main() { s := [...]string{"Mlxg", " ...

  9. P1087 FBI树 [2004普及]

    这是个正常的.很简单的分治,然后我成功地将这个题搞成了一个贼难搞的东西 还是说一下我那个非常麻烦的思路: 1. 建树 2. 后序遍历 然后就在建树的过程中死循环了,然后还一堆毛病 看了一个AC代码,该 ...

  10. APISpace 疫情地区校验API接口 免费好用

    从2019年疫情开始爆发到现在,我们去到某个地方都会提心吊胆的,很怕一不小心就染上了这个病毒.在去到某个地方之前,我们提前查看到它的一个疫情等级,同时做好防护再出门我们心里也会有底一些.所以疫情地区校 ...