「SHOI2014」概率充电器
题面
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」概率充电器的更多相关文章
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- 「SHOI2014」三叉神经树 解题报告
「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...
- [LOJ 2190] 「SHOI2014」信号增幅仪
[LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...
- 「SHOI2014」三叉神经树
「SHOI2014」三叉神经树 给你一颗由\(n\)个非叶子结点和\(2n+1\)个叶子结点构成的完全三叉树,每个叶子结点有一个输出:\(0\)或\(1\),每个非叶子结点的输出为自己的叶子结点中较多 ...
- 【LOJ】#2187. 「SHOI2014」三叉神经树
题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把 ...
- LOJ#2190. 「SHOI2014」信号增幅仪(最小圆覆盖)
题面 传送门 题解 我连椭圆是个啥都不知道导致这么简单一道题我一点思路都没有-- 我们把坐标系旋转一下,让半长轴成为新的\(x\)轴,也就是说所有点都绕原点逆时针旋转\(360-a\)度,然后再把所有 ...
- 【BZOJ】3566: [SHOI2014]概率充电器
[算法]树型DP+期望DP [题意]一棵树上每个点均有直接充电概率qi%,每条边有导电概率pi%,问期望有多少结点处于充电状态? [题解]引用自:[BZOJ3566][SHOI2014]概率充电器 树 ...
- BZOJ 3566: [SHOI2014]概率充电器( 树形dp )
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
随机推荐
- SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析(上)
概述 定义 Sentinel官网地址 https://sentinelguard.io/zh-cn/index.html 最新版本v1.8.4 Sentinel官网文档地址 https://senti ...
- numpy中的np.round()取整的功能和注意
numpy中的np.round()取整的功能和注意 功能 np.round() 是对浮点数取整的一个函数,一般的形式为 np.round(a, b),其中a为待取整的浮点数,b为保留的小数点的位数 注 ...
- 知道vue组件同级传值吗?
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 方法重载、方法重写、四种权限修饰、JavaBean、代码块
方法重载(overload) 一个类中可以含有多个重名的方法. 两同一不同 ①同一个类 ②同一个方法名 ③不同参数列表:参数个数不同,参数类型不同 方法重写(override) ①子类重写的方法的修饰 ...
- mysql中innodb和myisam区别
前言 InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了. 1.事务和外键 ● InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修 ...
- js与java encodeURI 进行编码与解码
JS escape()使用转义序列替换某些字符来对字符串进行编码 JavaScript 中国 编码后 JavaScript %u4E2D%u56FD unescape()对使用 encodeUR ...
- 毕设着急了吧?Python股票数据分析,制作动态柱状图
写在前面的一些屁话: 雪球成立于 2010 年,是北京雪球信息科技有限公司旗下推出的投资者社区.雪球一直致力于为中国投资者提供跨市场(沪深.香港.美国),跨品种(股票.基金.债券等)的数据查询.资讯获 ...
- Win10默认以管理员身份运行cmd命令提示符
如图所示操作
- java 改变图片的DPI
代码如下: public class test01 { private static int DPI = 300; public static void main(String[] args) { S ...
- 输入一个url全过程详解
1. 用户在浏览器中输入url,浏览器接收到url. 2.浏览器接收到这个url之后,会根据这个url会先查看缓存,如果有缓存且没有过期的话直接提供给客户端,完成页面渲染. 3.否则浏览器就会通过DN ...