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…

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("歌谣")); }}

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…

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(“我是儿子”); } } 定义一个测试…

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(“我们都很帅气”); }…

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…

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

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

项目管理(1):备战pmp

1什么是项目  一家公司被收购  海外建设通讯站点  研究院研发一种新型的药物  中国当局缉拿新疆针刺袭击嫌疑人  野生动物湿地保护区的建立  与朋友一起旅游  房屋装修  ………………请问哪些是项目&#xff1f; 2项目的发展历程  1900年代早期&#xff0c;H…

神经网络中使用Batch Normalization 解决梯度问题

BN本质上解决的是反向传播过程中的梯度问题。 详细点说&#xff0c;反向传播时经过该层的梯度是要乘以该层的参数的&#xff0c;即前向有&#xff1a; 那么反向传播时便有&#xff1a; 那么考虑从l层传到k层的情况&#xff0c;有&#xff1a; 上面这个 便是问题所在。因为网络…

项目管理(2):备战pmp

1项目阶段与项目生命周期 将每一个项目划分为若干个阶段&#xff08;phases&#xff09;&#xff0c;以便提高管理控制&#xff0c;并提供与该项目实施组织的日常运作之间的联系 这些阶段合在一起称为项目生命周期 项目的生命周期用于定义一个项目的开始和结束 许多组织识别出一…

2018-2019-1 20189213《Linux内核原理与分析》第四周作业

《Linux内核原理与分析》第四周学习总结&#xff1a; 1.课本知识总结&#xff1a; 本章内容并不多&#xff0c;首先是介绍了一些Linux内核源代码的目录结构&#xff0c;并基于Linux内核源代码构造一个简单的操作系统MenuOS&#xff0c;同时在MenuOS启动过程中跟踪分析Linux内核…

matlab窗函数带通滤波器,Matlab结合窗函数法设计数字带通FIR滤波器

Matlab结合窗函数法设计数字带通FIR滤波器 课程设计任务书学生姓名&#xff1a; 专业班级&#xff1a; 通信工程 指导教师&#xff1a; 工作单位&#xff1a; 信息工程学院 题 目:利用 Matlab 仿真软件系统结合窗函数法设计一个数字带通 FIR 滤波器初始条件&#xff1a; 1.《数…

java学习(53):接口的定义和创建

定义一个computer类 package com.company; public interface computer{ /定义公告&#xff0c;静态&#xff0c;常量/ public static final int MAX_NUM5000; /接口中只允许定义公共的抽象方法/ public abstract double couunt(double num1,double num2,char tag); } 定义一个…

java学习(54):接口之间的继承

定义一个接口类 //接口 interface interface4 { public abstract void fly(); public abstract void eat(); } //定义一个老鹰类 public class interface3 implements interface4{ public void fly(){ System.out.println(“我是老鹰&#xff0c;我会飞”); } public void eat…

Java排查问题随笔

常言道&#xff1a;“好记性不如烂笔头”&#xff0c;确实很有道理。在日常工作中&#xff0c;偶尔处理下线上问题还是很常见的&#xff0c;经常出现的情况就是忘记一些常用命令&#xff08;套路&#xff09;的用法了&#xff0c;因此整理下来非常用必要&#xff0c;以便关键时…

java学习(55):定义一个抽象类的继承

不同的是定义一个抽象类先 //抽象类 public abstract class interface4 { public abstract void fly(); public abstract void eat(); } //定义老鹰类继承 /定义一个老鹰类 public class interface3 extends interface4{ public void fly(){ System.out.println(“我是老鹰&…

java学习(57):内部类

/** 2 * 1.内部类可以直接访问外部类的成员&#xff0c;包括私有 3 * 2.外部类要访问内部类的成员必须创建对象 4 * author jjz 5 * 6 */ public class outer { //外部定义的方法 public void play(){ System.out.println(“我喜欢打篮球”); } public static void main(String…

java学习(59):static修饰内部类

class Outer { private int num 10; private static int num2 100; //内部类用静态修饰是因为内部类可以看出是外部类的成员public static class Inner {public void show() {//System.out.println(num);System.out.println(num2);}public static void show2() {//System.out…