这个题,题面是【】,出题人也是个【】

真就只放前向星过,把 vector 和离线建图都卡了。。。

题意:

一棵树,一条边有 \(p_i\) 的概率连接两个节点,一个点有 \(P_i\) 的概率亮着,问所有节点亮着的期望。

首先根据期望的线性性,所有节点亮着的期望明显可以拆成每个节点亮着的期望之和。然后仔细想想,\(E(X)=1 * p +0 * (1-p)=p\),所以只需要求亮着的概率即可。

怎么算呢?

考虑 dp,设 \(dp_1[u]\) 为 \(u\) 为根的子树中,\(u\) 亮着的概率。

直接算很困难,考虑算 \(u\) 不亮着的概率,不难发现是 \((1-P_u)\prod_{\texttt {v is u son}}(1-dp1[v] \times p_{(u,v)})\),用 \(1\) 减去即可得到 \(dp_1[u]\)。

接下来考虑换根。要求的东西还是一样的,只是需要维护父节点的 \(dp\) 值。

设 \(dp_2[u]\) 为考虑整棵树时 \(u\) 亮着的概率,此处为了方便设 \(f[u]\) 为去掉 \(u\) 为根的子树时,其父亲节点亮着的概率。

对于 \(u\) 的一个儿子 \(v\),我们很容易能够发现有 \(f[v]=(1-p_{(u,f[v])}\prod_{\texttt {x is u son }\And x \ne v } 1-dp1[x] \times e_{(u,x)})\)。

大多数同学都是直接用 \(dp2[u]\) 和 \(dp1[v]\) 直接进行转移,来得到其值,但其实可以对儿子维护一个前缀积和后缀积,这样就不会出现除法的问题了。

#include<cstdio>
#include<vector>
#include<cctype>
typedef double db;
const int M=5e5+5;
int n,m,cnt,h[M],f[M];db ans,p[M],dp1[M],dp2[M];
db v[M],lp[M],rp[M];
struct Edge{
int v,nx;db p;
}e[M<<1];
inline void Add(const int&u,const int&v,const db&p){
e[++cnt]=(Edge){v,h[u],p};h[u]=cnt;
e[++cnt]=(Edge){u,h[v],p};h[v]=cnt;
}
inline int read(){
int n(0);char s;
while(!isdigit(s=getchar()));
while(n=n*10+(s&15),isdigit(s=getchar()));
return n;
}
void DFS1(int u){
dp1[u]=1-p[u];
for(int E=h[u];E;E=e[E].nx)if(e[E].v^f[u])f[e[E].v]=u,DFS1(e[E].v),dp1[u]*=(1-dp1[e[E].v]*e[E].p);dp1[u]=1-dp1[u];
}
void DFS2(int u){
int e,i,len(0);db p=(dp2[u]*=1-::p[u]);
for(e=h[u];e;e=::e[e].nx)if(::e[e].v^f[u])v[++len]=1-dp1[::e[e].v]*::e[e].p;
for(i=1;i<=len;++i)lp[i]=(i==1?1:lp[i-1])*v[i];
for(i=len;i>=1;--i)rp[i]=(i==len?1:rp[i+1])*v[i];
for(e=h[u],i=1;e;e=::e[e].nx){
if(::e[e].v==f[u])continue;Edge&E=::e[e];dp2[E.v]*=p;dp2[u]*=1-dp1[E.v]*E.p;
if(i^1)dp2[E.v]*=lp[i-1];if(i^len)dp2[E.v]*=rp[i+1];
dp2[E.v]=1-(1-dp2[E.v])*E.p;++i;
}
for(e=h[u];e;e=::e[e].nx)if(::e[e].v^f[u])DFS2(::e[e].v);dp2[u]=1-dp2[u];
}
signed main(){
int i,u,v,p;n=read();
for(i=1;i<n;++i)u=read(),v=read(),p=read(),Add(u,v,.01*p);
for(i=1;i<=n;++i)::p[i]=.01*read(),dp2[i]=1;DFS1(1);DFS2(1);
for(i=1;i<=n;++i)ans+=dp2[i];printf("%.6f",ans);
}

LGP4284题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. NSString为何要用copy修饰,而不是strong?

    NSString本身是无所谓的,但是如果一个 NSString 指针指向了一个 NSMutableString的内存空间的话,如果使用 strong 修饰的话,如果你在别处修改这个值的话,那么原来的值 ...

  2. Springcloud-微服务

    1.什么是微服务? 通过阅读马丁弗勒关于描述微服务的文章(https://martinfowler.com/articles/microservices.html),在此特作仅用作个人理解的关于微服务 ...

  3. 内部类&异常

    /* 内部类 内部类类别: 成员内部类: 在一个类的成员位置定义另外一个类,那么另外 一个 类就称作为成员内部类. 成员内部类的访问方式: 方式1: 在外部类内提供一个方法创建内部类的对象进行访问. ...

  4. ios 类别和扩展-赵小波

    类别 @interface ClassName ( CategoryName ) // method declarations @end Category在iOS开发中使用非常频繁.尤其是在为系统类进 ...

  5. 无意进去UIView随笔闹腾着玩 -by 胡 xu

    1 @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> ...

  6. java-数据库操作(JDBC)

    前言:JDBC用到的API和常用方法 DriverMannager类 加载驱动并创建与数据库的连接,通常使用Class类的静态方法forName()来实现加载驱动,使用getConnection(St ...

  7. C#Winform 注册使用全局快捷键详解

    C#.NET Winform 注册使用全局快捷键详解 借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Wi ...

  8. JSP中引入JQuery和Layer,浏览器控制台报错404

    路径没有写错,文件也存在为什么会报404呢?,解决方法是将layer文件夹使用source的方式 解决办法: 这时候你会发现layer文件夹变成了蓝色,重启一次服务器,页面中就没有报404异常了 总结 ...

  9. 神奇!这款 Vue 后台框架居然不用手动配置路由

    前言 做 Vue 开发脱离不了路由,尤其是中大型项目,页面多且杂,在配置路由的时候总是会变得逐渐暴躁,因为费时,并且又没有什么太多技术含量,总觉得是在浪费时间. 另外如果接手了别人的项目,当业务有变更 ...

  10. 目前市面上报表软件下载排名的TOP5

    目前,大部分的工作仍然离不开表格,而且工作表格的呈现更酷.效率要求更高.可以简化复杂的操作,大大提高工作效率.在企业管理中,报表可以以图表等简洁的方式向用户显示数据,从而提高工作效率.许多哦公司紧跟信 ...