题解 [SHOI2014]概率充电器

前情提要:最近大佬们都在写题解,只有我在咕咕咕。QAQ;明明我都把flag写出来辣,dalao们没看见,然后就被嘲讽了,QAQ

洛谷

树形DP+期望(讲了两次,菜鸡的我才做QAQ)


 

首先,每个充电元件和电源之间的关系可以用一棵树来表示。通过感性分析可知,每个元件对于期望的贡献就是0/1。(进入状态就是1,否则就是0)。故而进入充电状态的元件的个数的期望就是元件进入充电状态的概率。

那么设元件进入充电状态的概率为${\large{p[]}}$,我们要求的就转化为${\large{\sum_{i=1}^np[i]}}$

然后我们就开始设计状态来求解${\large{p[]}}$。显然我们可以知道,一个点被充电只有两种可能:自己被自己所在的子树(包括自己)充上,自己被自己的父亲充上

然后开始思考,,,,,一万年之后 我们发现,如果设计的状态是被充上电的话,状态就很难写,所以我们决定把状态设为不会被充上电的概率,即

${\large{f[]}}$不会被自己所在子树充上电的概率,${\large{g[]}}$不会被自己的父亲充上电的概率

同时我们设已知量导线导电的概率为${\large{val[][]}}$表示${\large{i->j}}$可以充电的概率。用${\large{q[]}}$表示自己被自己充上电的概率。

首先求看起来比较容易求的${\large{f[]}}$

不被自己所在的子树充上电,要满足${\color{red}{既不会}}$自己被自己充上电,${\color{red}{又不会}}$被自己的儿子充上电。不被自己的儿子充上电又分两种情况:第一种是儿子自己本身就没有电,第二个是儿子有点但是导线没有电。所以dp式子如下:

${\large{f[i]=\prod_{v\in{son[i]}}(1-q[i])*(f[v]*(1-val[i][v])+f[v])}}$

然后再来看看比较难求的不会被自己父亲充上电的概率${\large{g[]}}$

不会被自己的父亲充上电有两种情况,第一种是自己的父亲没有电,即自己的父亲既不会被自己的所在的子树充上电,又不会被自己的父亲充上电。第二种情况就是父亲有电,但是链接父亲和自己的导线不能导电。同时要注意的一个点就是我们问的是某个点会不会被自己的父亲充上电,所以这个点自己${\color{red}{没电}}$。故,当我们在求解父亲会不会被自己儿子充上电的时候,要注意除去该儿子有电的概率。由于父亲没电的概率要一个长式子来表示,所以我们先设父亲没电的概率为${\large{Q}}$,则有DP式子如下:

${\large{Q=\frac{g[i]*f[i]}{f[v]+(1-f[v])*(1-val[i][v])},v\in{son[i]}}}$

${\large{g[v]=Q+(1-Q)*(1-val[i][v])}}$

最后的答案就是这个点既不会不被自己所在的子树充上电,又不会不被自己的父亲节点充上电的概率和

剩下的就是树形DP的板子式的写法了(不过要注意浮点数)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 namespace the_Death{
 6     const int maxn=5e5+100;bool vis[maxn];
 7     int head[maxn],ver[maxn<<1],nxt[maxn<<1],tot,n,x,y,pre[maxn];
 8     double edge[maxn<<1],z,f[maxn],q[maxn],g[maxn],Q,ans;
 9     inline void add(int x,int y,double z){
10         ver[++tot]=y,nxt[tot]=head[x];
11         head[x]=tot;edge[tot]=z*1.00/100.0;
12     }
13     inline void dfs(int x,int fa){
14         pre[x]=fa;f[x]=(1-q[x]);
15         for(register int i=head[x];i;i=nxt[i]){
16             int y=ver[i];
17             if(y==fa||vis[y]) continue;
18             vis[y]=1;dfs(y,x);
19             f[x]*=((1.0-f[y])*(1-edge[i])+f[y]);
20         }
21     }
22     inline void solve(int x){
23         for(register int i=head[x];i;i=nxt[i]){
24             int y=ver[i];
25             if(vis[y]||y==pre[x]) continue;
26             vis[y]=1;
27             Q=(g[x]*f[x])/(1.0*(f[y]+(1-f[y])*(1-edge[i])));
28             g[y]=Q+(1-Q)*(1-edge[i]);
29             solve(y);
30         }
31     }
32     int main(){
33         scanf("%d",&n);g[1]=1;
34         for(register int i=1;i<n;i++)
35             scanf("%d%d%lf",&x,&y,&z),
36             add(x,y,z),add(y,x,z);
37         for(register int i=1;i<=n;i++) 
38             scanf("%lf",&z),q[i]=z/100.0;
39         //它给的是直接充电的概率*100,所以要除回去
40         dfs(1,0);
41         memset(vis,0,sizeof(vis));
42         solve(1);
43         for(register int i=1;i<=n;i++) 
44             ans+=1.0-f[i]*g[i];
45         printf("%.6lf",ans);return 0;
46     }
47 }
48 int main(){
49     the_Death::main();system("pause");
50 }
View Code

 

转载于:https://www.cnblogs.com/fallen-down/p/11560039.html

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

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

相关文章

AtCoderGC038B - Sorting a Segment 数据结构 + RMQ

题意&#xff1a;给定一个长度为N的排列&#xff0c;你只能对其中长度为K的连续子序列进行一次从小到大的排序&#xff0c;问&#xff1a;排序之后能形成多少不同的排列&#xff1f; 数据范围&#xff1a; 1 < n, k < 200,000&#xff0c; k < n. -------------------…

luogu P2216 [HAOI2007]理想的正方形 递推+ST表

题意&#xff1a;有一个a*b的整数组成的矩阵&#xff0c;现请你从中找出一个n*n的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 数据规模&#xff1a; &#xff08;1&#xff09;矩阵中的所有数都不超过1,000,000,000 &#xff08;2&#xff09;20%的数…

[USACO12MAR]花盆Flowerpot 二分答案+单调队列

题意&#xff1a; 给出N滴水的坐标&#xff0c;y表示水滴的高度&#xff0c;x表示它下落到x轴的位置。 每滴水以每秒1个单位长度的速度下落。你需要把花盆放在x轴上的某个位置&#xff0c;使得从被花盆接着的第1滴水开始&#xff0c;到被花盆接着的最后1滴水结束&#xff0c;之…

jQuery使用手册

jQuery是一款同prototype一样优秀js开发库类&#xff0c;特别是对css和XPath的支持&#xff0c;使我们写js变得更加方便&#xff01;如果你不是个js高手又想写出优 秀的js效果&#xff0c;jQuery可以帮你达到目的&#xff01;下载地址&#xff1a;Starterkit &#xff08;http:…

全志_外部中断

全志_外部中断 平台&#xff1a;全志A64 源码&#xff1a;Android 7.1  Linux3.1 1 #include <linux/init.h>2 #include <linux/module.h>3 #include <linux/fs.h>4 #include <linux/device.h>5 #include <linux/slab.h>6 #include <linux/…

[ZJOI2007]时态同步 树形DP

题意&#xff1a;给定一棵N个节点的无根树&#xff0c;每条边都有一个权值V&#xff0c;选取其中一个点作为关键点&#xff0c;你可以任意增加某条边的权值&#xff0c;求使得从关键点出发&#xff0c;到任意一个叶子节点的距离都相同所需要增加的权值和。 数据范围&#xff1a…

题解P3942_将军令

初始数组忘了赋初值&#xff0c;&#xff0c;&#xff0c;我真是个机灵鬼 还有这题是三倍经验P2279&&P2016&#xff0c;这题的实现思想来自P2279首个题解 luogu 简化题意 给你一棵树&#xff0c;你有一些可以覆盖范围为$k$的障碍物&#xff0c;问最少放几个障碍物可以使…

[SCOI2009]生日礼物 单调性尺取法

题意&#xff1a;给你n个k种颜色的点&#xff0c;每个点都有坐标和颜色两个属性&#xff0c;选出一个长度尽量短的区间&#xff0c;使得每种颜色的点都在区间内出现。 数据范围&#xff1a; 对于50%的数据&#xff0c; N≤10000&#xff1b; 对于80%的数据&#xff0c; N≤8000…

PJ2018T4 对称二叉树 树形结构

题意&#xff1a;现在给出一棵二叉树&#xff0c;希望你找出它的一棵子树&#xff0c;该子树为对称二叉树&#xff0c;且节点数最多。请输出这棵子树的节点数。对称二叉树满足&#xff1a;将这棵树所有节点的左右子树交换后&#xff0c;新树和原树对应位置的结构相同且点权相等…

提高ASP.Net应用程序性能的十大方法

一、返回多个数据集 检查你的访问数据库的代码&#xff0c;看是否存在着要返回多次的请求。每次往返降低了你的应用程序的每秒能够响应请求的次数。通过在单个数据库请求中返回多个结果集&#xff0c;可以减少与数据库通信的时间&#xff0c;使你的系统具有扩展性&#xff0c;…

【NOIP2015提高组】子串 区间DP+滚动数组优化

题意&#xff1a; 有两个仅包含小写英文字母的字符串 A 和 B。 现在要从字符串 A 中取出 k 个互不重叠的非空子串&#xff0c;然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。 请问有多少种方案可以使得这个新串与字符串 B 相等&#xff1f; …

教你如何去淘便宜机票

机票四月二十日集体变相涨价后&#xff0c;中央电视台曾经报道&#xff0c;今后没有5折以下机票&#xff0c;今后也不再叫多少折&#xff0c;而是直接报价&#xff0c;但是春秋航空不再此之列&#xff0c;原因是这次变相提价是一个叫中航信公司在操作&#xff0c;他们不代理春秋…

32位单精度浮点乘法器的FPGA实现

摘 要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码&#xff0c;和Wallace 树结构, 提高了乘法器的速度。本文使用Altera Quartus II 4.1仿真软件, 采用的器件是EPF10K100EQ 240 -1, 对乘法器进行了波形仿真, 并采用0.5CMOS工艺…

我们的运动会

不久前&#xff0c;我们举办了微软中国研发集团的首届运动会。遗憾的是&#xff0c;当时我自己由于公务在身没能参加。事后同事们把许多精彩的图片与我分享&#xff0c;让我十分羡慕他们有机会大显身手&#xff0c;现在贴出来让大家看看他们的飒爽英姿&#xff0c;一睹为快。运…

性能测试工具SilkPerformer介绍

SilkPerformer 是业界最强大&#xff0c;且最易用的企业级负载和强度测试解决方案&#xff0c;用于对关键任务应用的质量进行优化。SilkPerformer使用可视化脚本生成技术和对存在成千上万的并发用户的多个应用环境进行测试的能力&#xff0c;使您能够在企业应用部署之前&#x…

Office2010试用

昨天看到了Office的下载地址&#xff0c;就安装了一个试了试&#xff0c;总体感觉和Office2007变化不大&#xff0c;外观配色上看起来非常舒服&#xff0c;Aero效果用得更多了&#xff0c;具体功能改进还没有细研究&#xff08;其实一直感觉到了2003后的更新大都只是在界面和适…

配置WINDOWS群集

配置WINDOWS群集 实验说明&#xff1a;本实验用于配置WINDOWS群集 实验名称&#xff1a;配置WINDOWS群集 实验目的&#xff1a;理解WINDOWS群集服务的工作原理&#xff0c;熟练掌握安装WINDOWS群集服务及配置WINDOWS群集 实验设备&#xff1a;windows server 2003 VM 二台 实验…

李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》

从开始搞.NET开发至今已经有六、七年了&#xff0c;从当初对.NET一无所知&#xff0c;到现在领导研发团队进行各种项目的开发和架构设计&#xff0c;几年里经历了各种沟沟坎坎&#xff0c;无论是技术上的&#xff0c;还是管理上的。这些经历和经验就像一笔财富&#xff0c;为自…

计组学习笔记(一):浮点数的表示和运算

最近学习计算机组成原理&#xff0c;遇到许多疑难问题&#xff0c;接下来写一写我在学习浮点数方面知识的理解&#xff0c;在巩固的同时也方便日后的复习。一、浮点数的表示1、浮点数的表示格式浮点数&#xff0c;顾名思义&#xff0c;就是小数点不固定的数。计算机中&#xff…

如何查看linux的版本

虽然用过些版本的LINUX系统&#xff0c;但是没有查看过具体的版本是多少来着&#xff0c;下午心血来潮&#xff0c;想查看下自己的版本&#xff0c;到网上收索了下&#xff0c;看到有一大堆命令出来&#xff0c;呵呵&#xff0c;1 最简单的一个uname -a2 cat /etc/issue …