题目大意:一颗树,给定每个点消失的概率,求出连通块的期望值。要求支持修改消失概率的操作并且给出每次修改过后的期望值。注意被破坏的点不能算入连通块中。

数据范围,时限1S。

传送门 D. Interstellar battle

我们考虑做有根树的DP。设1为根。

我们设为v节点消失的概率,设分别表示v节点被破坏/没被破坏时的连通块期望值。

解释一下f[v][1]的转移方程:因为如果v节点没有被破坏,并且儿子节点sn也没有被破坏,那么连通块的个数会减少,减少的数量就是sn所在的连通块的期望,也就是

当然我们不可能每次询问了就DFS一遍计算,所以我们需要再研究一下递推式。

我们先只考虑4号点对答案的贡献。我么按照递推式模拟一遍。

最后答案就是,也就是。推广到一般情况:v对答案的贡献就是,特别地,设(0是1的父亲)。

知道这个结论过后维护起来就特别方便了。我们记。修改一个点的概率时就相应地修改值就行了(具体见代码)。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#define ll long long
#define N 100005 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n,m;
double p[N];
struct load {int to,next;}s[N<<1];
int h[N],cnt;
void add(int i,int j) {s[++cnt]=(load) {j,h[i]};h[i]=cnt;}
int fa[N];
double sum[N];
void dfs(int v,int fr) {
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(to==fr) continue ;
fa[to]=v;
dfs(to,v);
sum[v]+=(1-p[to]);
}
}
double ans,c;
int main() {
n=Get();
for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
p[0]=1;
int a,b;
for(int i=1;i<n;i++) {
a=Get()+1,b=Get()+1;
add(a,b),add(b,a);
}
dfs(1,0);
for(int i=1;i<=n;i++) {
ans+=p[fa[i]]*(1-p[i]);
}
m=Get();
while(m--) {
a=Get()+1;
scanf("%lf",&c);
ans-=p[fa[a]]*(1-p[a]);
ans-=sum[a]*p[a];
sum[fa[a]]-=1-p[a];
p[a]=c;
ans+=p[fa[a]]*(1-p[a]);
ans+=sum[a]*p[a];
sum[fa[a]]+=1-p[a];
cout<<ans<<"\n";
}
return 0;
}

然而,总觉得我的做法太不清真了。网上一搜题解,才发现了自己的naive。原来期望是可以分开计算的,也就是说可以分别算出每一对节点对答案的贡献在加起来。然后公式基本相同的。

codeforces 1045 D. Interstellar battle的更多相关文章

  1. Codeforces 1045D Interstellar battle 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045D.html 题目传送门 - CF1045D 题意 给定一棵有 $n$ 个节点的树,第 $i$ 个节点 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  4. Codeforces 567D:One-Dimensional Battle Ships(二分)

    time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...

  5. 2018.09.27 codeforces1045D. Interstellar battle(期望dp)

    传送门 一道有意思的期望dp. 题意是给出一棵树,每个点最开始都有一个gg的概率,有m次修改,每次修改会把某个点gg的概率更换掉,让你求出每次修改之后整个树被分成的连通块的数量的期望(gg掉的点不算) ...

  6. 【Codeforces 1141E】Superhero Battle

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分最后轮了几圈. 二分之后直接o(N)枚举具体要多少时间即可. 注意爆long long的情况. 可以用对数函数,算出来有多少个0 如果大于 ...

  7. 【Codeforces 567D】One-Dimensional Battle Ships

    [链接] 我是链接,点我呀:) [题意] 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,.. ...

  8. Codeforces Round #541 (Div. 2) (A~F)

    目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...

  9. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. 如何用TexturePacker打包素材

    如何用TexturePacker打包素材 TexturePacker是一个非常好用的图片素材打包工具,它能帮助你减少游戏的图片内存使用. 官方下载地址:http://www.codeandweb.co ...

  2. git第十节--git hub

    github 是一个开源的协作社区 github 插件octtree 为别人的仓库做贡献 fork 别人仓库内容到自己的个人仓库 git clone 到本地进行开发push 到个人仓库 提PR(pul ...

  3. Angular2入门:TypeScript的函数 - 剩余参数和箭头函数

  4. Mybatis之分页插件pagehelper的简单使用

    最近从家里回来之后一直在想着减肥的事情,一个月都没更新博客了,今天下午没睡午觉就想着把mybatis的分页插件了解一下,由于上个月重新恢复了系统,之前创建的项目都没了,又重新创建了一个项目. 一.创建 ...

  5. 关于toggle事件委托的处理

    当html页面加载后,页面上需要再次动态加载的按钮等事件的绑定,我们有两种处理方案 一.再次加载后进行绑定 二.使用委托进行绑定 而toggle事件是无法直接绑定的,这时可以转化为click的事件,并 ...

  6. EXISTS 执行顺序

    select * from a where a.s_status=1 and exists (select orderid from b where a.orderid=b.orderid) exis ...

  7. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  8. Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    目录 引言 四种线程池 newCachedThreadPool:可缓存的线程池 newFixedThreadPool:定长线程池 newSingleThreadExecutor:单线程线程池 newS ...

  9. Java框架之Struts2(四)

    一.ComboGrid 扩展自$.fn.combo.defaults和$.fn.datagrid.defaults.使用$.fn.combogrid.defaults重写默认值对象.数据表格下拉框结合 ...

  10. 【Mybatis】多对多实例

    ①创建数据库和表,数据库为mytest,表为users.orders和users_orders DROP TABLE IF EXISTS users; CREATE TABLE users( id I ...