Luogu 4284 [SHOI2014]概率充电器

BZOJ 3566

树形$dp$ + 概率期望。

每一个点的贡献都是$1$,在本题中期望就等于概率。

发现每一个点要通电会在下面三件事中至少发生一件:

1、它自己通电了。

2、它的父亲给它通电了。

3、它的儿子给它通电了。

那么我们设$f_i$表示它的父亲给它通电的概率,$g_i$表示它的子树中给它通电的概率,那么最后的答案$\sum_{i = 1}^{n}f_i + g_i - f_i * g_i = \sum_{i = 1}^{n}1 - (1 - f_i) * (1 - g_i)$。

感觉好麻烦,直接把$f_i$和$g_i$设成不通电的概率好了。

先考虑计算$g$。

假设每个点$i$自己通电的概率是$a_i$,一条连接着$x$和$y$的边通电的概率是$val(x, y)$,那么$g_x = (1 - a_x)\prod_{y \in son(x)}(g_y + (1 - g_y) * (1 - val(x, y)))$。

因为如果一个点不从自己的子树中得到电,那么它自己一定没有电,然后对于每一个儿子,要么不通电,要么通了电但是这条边是不通电的,电量传递不上来。

然后考虑计算$f$,对于一对父子关系的点$(x, y)$,我们发现要么$x$不带电,要么$x$带了电但是这条边传递不过来,那么$x$不带电的概率$P = \frac{f_x * g_x}{g_y + (1 - g_y) * (1 - val(x, y))}$,

这时候我们默认$y$是不带电的,但是我们在计算$g_x$的时候多算了$y$的贡献,所以要除掉,然后$f_y = P + (1 - P) * (1 - val(x, y))$。

时间复杂度$O(n)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef double db;const int N = 5e5 + 5;int n, tot = 0, head[N];
db a[N], f[N], g[N];struct Edge {int to, nxt;db val;
} e[N << 1];inline void add(int from, int to, db val) {e[++tot].to = to;e[tot].val = val;e[tot].nxt = head[from];head[from] = tot;
}inline void read(int &X) {X = 0; char ch = 0; int op = 1;for(; ch > '9' || ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}void dfs1(int x, int fat) {g[x] = 1 - a[x];for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(y == fat) continue;dfs1(y, x);g[x] *= (g[y] + (1 - g[y]) * (1 - e[i].val));}
}void dfs2(int x, int fat, int inEdge) {if(!fat) f[x] = 1.0;else {db p = g[fat] * f[fat] / (g[x] + (1 - g[x]) * (1 - e[inEdge].val));f[x] = p + (1 - p) * (1 - e[inEdge].val);}for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(y == fat) continue;dfs2(y, x, i);}
}int main() {
//    freopen("2.in", "r", stdin);
    read(n);for(int x, y, v, i = 1; i < n; i++) {read(x), read(y), read(v);db val = 1.0 * v / 100.0;add(x, y, val), add(y, x, val);}for(int i = 1; i <= n; i++) {int v; read(v);a[i] = 1.0 * v / 100.0;}dfs1(1, 0);dfs2(1, 0, 0);/*    for(int i = 1; i <= n; i++)printf("%f ", f[i]);printf("\n");for(int i = 1; i <= n; i++)printf("%f ", g[i]);printf("\n");    */db ans = 0;for(int i = 1; i <= n; i++)ans += (1 - g[i] * f[i]);printf("%.6f\n", ans);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9875864.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 域的隐藏_Windows Server 2008R2\2012\2016使用域策略自定义隐藏指定驱动器

Windows Server 2008R2\2012\2016使用域策略自定义隐藏指定驱动器最近在做项目的时候需要对Win7客户端的部分驱动器进行隐藏&#xff0c;但域策略默认的隐藏选项不能满足需求&#xff0c;根据微软官方文档https://support.microsoft.com/zh-cn/help/231289/using-group-policy-…

java学习(47):带参无返回

//带参无返回值 /*注意&#xff1a; 1、 调用带参方法时&#xff0c;必须保证实参的数量、类型、顺序与形参一一对应 2、 调用方法时&#xff0c;实参不需要指定数据类型 3、 方法的参数可以是基本数据类型&#xff0c;如 int、double 等&#xff0c;也可以是引用数据类型&am…

day10 Pyhton学习

一.昨日内容回顾 函数: 定义:对功能或者动作的封装 def 函数名(形参): 函数体 函数名(实参) return: 返回,当程序运行到return的时候,终止函数的执行 一个函数一定拥有返回值 1.什么都不写,返回None 2.只写return,返回None 3. return 值,返回一个值 4.return 值1,值2,值3...返…

java学习(48):带参带返回

public class test14 { public String show(String name) { return “欢迎您,” name "!"; } public static void main(String[] args) {test14 hello new test14();hello.show("歌谣");System.out.println(hello.show("歌谣")); }}

第一讲、单例模式

1.定义 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 GOF对单例模式的定义是&#xff1a;保证一个类、只有一个实例存在&#xff0c;同…

php怎么自动识别车牌号,车牌号自动识别系统怎么录入,很多你不知道的潜规则...

每次去商场之类的&#xff0c;车辆都需要自动识别下&#xff0c;不用下车就可以完成的操作&#xff0c;的确是方便的很。今天要讲的&#xff0c;就是关于车牌号自动识别系统怎么录入方面的内容&#xff0c;了解其中的原理&#xff0c;才能更好的去消费它。一、车牌识别系统车牌…

java学习(49):方法重载

定义一个computer类 public class computer { public void runSoftWor(vidio vedio){ System.out.println("视频长度是 "vedio.getLength()); } public void runSoftWor(Voice voice){System.out.println("歌曲的名字是 "voice.getTitle()); }public bool…

初始CSS

一.引入样式1.行内样式表<h1 style"color: red;font-size: 18px;">10-30</h1>2.内部样式表(在head标签里面,title标签下面)<style type"text/css">h2{color: yellow;font-size: 20px;}</style>优点方便在同页面中修改样式缺点不利…

java学习(50):子类继承会优先调用父类的构造器

定义一个父类 public class Parent { public void run(){ System.out.println(“我会跑步”); } public Parent(){ System.out.println(“我是爸爸”); } } 定义一个子类 public class Son extends Parent { public Son(){ System.out.println(“我是儿子”); } } 定义一个测试…

java去除不为null,java – 选择特定字段不为NULL的所有记录

我有一个名为stars的MySQL表,其中一个字段是id_num,默认值为NULL.我想通过java中的PreparedStatement选择id_num不为NULL的所有记录.现在我正在尝试这个&#xff1a;private final String idStarsSQL "select * from stars where id_num is not ?";...preparedStat…

Get Requests with Json Data Get Requests with Url Parameters

转载于:https://www.cnblogs.com/chengchengla1990/p/9883536.html

java学习(51):上转型对象

定义一个animal类 //java上转型对象 public class Animal { public String name“动物”; public String getName(){ return name; } public void action(){ System.out.println(“动物都在我的分类之中”); } public void feature(){ System.out.println(“我们都很帅气”); }…

php100教程源码,PHP100 视频教程 2012-2013版_PHP教程

教程名称&#xff1a;PHP100 视频教程 2012-2013版《PHP100系列视频教程》从2008年至今共计发布了近200多期的视频教程&#xff0c;涉及了WEB开发和php开发的方方面面&#xff0c;也是互联网中设计PHP开发最全面的教程系列。我们的教程就是让人人都可以学会WEB开发和PHP程序设计…

数组排序并找出元素索引--Where do I belong-FCC

数组排序并找出元素索引 先给数组排序&#xff0c;然后找到指定的值在数组的位置&#xff0c;最后返回位置对应的索引。 举例&#xff1a;where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4]&#xff0c;而1.5对应的索引值就是1。 同理&#xf…

java学习(52):抽象类

//定义一个人的抽象类 public abstract class Person { public abstract void eat();//吃饭 public abstract void drink();//喝水 public abstract void play();//玩 } //定义一个富人的抽象类 public abstract class Rich extends Person{ public abstract void buy();//买 p…

php 汉字分割,php支持中文字符串分割的函数

str_split不支持中文&#xff0c;利用mb_xx函数实现个/*** Convert a string to an array* param string $str* param number $split_length* return multitype:string*/function mb_str_split($str,$split_length1,$charset"UTF-8"){if(func_num_args()1){return pr…

python中使用正则模板匹配结果

正则配置处理类文件 util_tool.py #!/usr/bin/env python# -*- coding: utf-8 -*-"""Util Module for functionality shared between modules"""import redef combine_dicts(recs): """Combine a list of recs, appending val…

玩转oracle 11g(8):使用profile管理用户口令

使用profile管理用户口令 概述&#xff1a;profile是口令限制&#xff0c;资源限制的命令集合&#xff0c;当建立数据库的&#xff0c;oracle会自动建立名称为default的profile。当建立用户没有指定profile选项&#xff0c;那么oracle就会将default分配给用户。 1.账户锁定 概述…

RegexDemo6

package cn.zzDemo;/** 转换功能&#xff1a;* String类的public String replaceAll(String regex,* String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 */public class RegexDemo6 {public static void main(String[] args) {// 定…

玩转oracle 11g(9):crud操作(亲测)

oracle支持的数据类型 字符类 char 定长 最大2000个字符。 例子&#xff1a;char(10) ‘小韩’前四个字符放‘小韩’&#xff0c;后添6个空格补全 如‘小韩’ varchar2(20) 变长 最大4000个字符。 例子&#xff1a;varchar2&#xff08;10&#xff09; ‘小韩’ oracle分配四个…