Codeforces 1045D Interstellar battle 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045D.html
题目传送门 - CF1045D
题意
给定一棵有 $n$ 个节点的树,第 $i$ 个节点有 $p_i$ 的概率消失。有 $q$ 次操作,每次操作修改一个节点消失的概率,请你在每一次操作之后输出树的期望连通块个数。
$n,q\leq 10^5$
题解
首先我们考虑如何求解不操作的情况。
考虑期望的线性性,我们统计每一个节点对答案的负贡献。
首先,假装每一个节点都是一个连通块。
对于节点 x ,如果他消失了,那么连通块个数 -1,由于他消失的概率是 $p_x$ ,他对期望的负贡献为 $p_i$ 。
对于无序数对 $(x,y)$ ,如果 x 和 y 有边连接,那么,当且仅当他们都存在,才会对连通块个数产生负贡献,所以它对期望的负贡献为 $(1-p_x)(1-p_y)$ 。
完成了这个问题之后,修改操作也变得简单了。
首先给树定根。然后,只需要对于每一个节点 x 维护一个 vson[x] 代表其所有儿子的 $(1-p_y)$ 之和。修改操作就变的简单了。
时间复杂度 $O(n)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int n,Q,fa[N];
double v[N],vson[N],ans;
vector <int> e[N];
void solve(int x,int pre){
ans-=1.0-v[x];
fa[x]=pre,vson[x]=0;
for (auto y : e[x])
if (y!=pre){
ans-=v[x]*v[y];
vson[x]+=v[y];
solve(y,x);
}
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
e[i].clear();
v[0]=0;
for (int i=1;i<=n;i++)
scanf("%lf",&v[i]),v[i]=1.0-v[i];
for (int i=1,a,b;i<n;i++){
scanf("%d%d",&a,&b),a++,b++;
e[a].push_back(b);
e[b].push_back(a);
}
ans=n;
solve(1,0);
scanf("%d",&Q);
while (Q--){
int x;
double y;
scanf("%d%lf",&x,&y),x++;
ans+=v[fa[x]]*vson[fa[x]]+v[x]*vson[x]+1.0-v[x];
vson[fa[x]]-=v[x];
v[x]=1.0-y;
vson[fa[x]]+=v[x];
ans-=v[fa[x]]*vson[fa[x]]+v[x]*vson[x]+1.0-v[x];
printf("%.6lf\n",ans);
}
return 0;
}
Codeforces 1045D Interstellar battle 概率期望的更多相关文章
- 2018.09.27 codeforces1045D. Interstellar battle(期望dp)
传送门 一道有意思的期望dp. 题意是给出一棵树,每个点最开始都有一个gg的概率,有m次修改,每次修改会把某个点gg的概率更换掉,让你求出每次修改之后整个树被分成的连通块的数量的期望(gg掉的点不算) ...
- Codeforces 912D Fishes (概率&期望,优先队列的应用)
题目链接 Fishes 题意 在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...
- Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )
题意 : 给出一个 N * M 的网格,然后给你 K 条鱼给你放置,现有规格为 r * r 的渔网,问你如果渔网随意放置去捕捞小鱼的情况下,捕到的最大期望值是多少? 分析 : 有一个很直观的想法就是 ...
- codeforces 1045 D. Interstellar battle
题目大意:一颗树,给定每个点消失的概率,求出连通块的期望值.要求支持修改消失概率的操作并且给出每次修改过后的期望值.注意被破坏的点不能算入连通块中. 数据范围,时限1S. 传送门 D. Interst ...
- Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp
一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...
- CodeForces - 28C Bath Queue 概率与期望
我概率期望真是垃圾--,这题搞了两个钟头-- 题意 有\(n\)个人,\(m\)个浴室,每个浴室里有\(a_i\)个浴缸.每个人会等概率随机选择一个浴室,然后每个浴室中尽量平分到每个浴缸.问期望最长排 ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)
[Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
随机推荐
- Codeforces 848C Goodbye Souvenir [CDQ分治,二维数点]
洛谷 Codeforces 这题我写了四种做法-- 思路 不管做法怎样,思路都是一样的. 好吧,其实不一样,有细微的差别. 第一种 考虑位置\(x\)对区间\([l,r]\)有\(\pm x\)的贡献 ...
- LONG数据类型转换为VARCHAR2并相互转换
--方法1,支持表 --plsql中将long类型隐式转换为varchar2,但是sql不能CREATE OR REPLACE FUNCTION LONG_TO_CHAR( in_rowid rowi ...
- js学习——函数
函数声明 function funName(parameter){} 函数表达式,并把函数存储在变量x中 //不用给函数名,后续并不能直接用给定的函数名调用 var x = function(a){r ...
- 解决 安装或卸载软件时报错Error 1001 的问题
卸载或安装程序时出错1001:错误1001可能发生在试图更新.修复或卸载windows os中的特定程序时.此问题通常是由于程序的先前安装损坏而引起的. 错误“1001”通常会遇到,因为程序的先前安装 ...
- oracle数据库内存调整之增加内存
注:本文来源:小颜Kevin <oracle数据库内存调整之增加内存> 模拟操作系统内存从2G增加为8G后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...
- Confluence 6 让 Jira 应用停止发送通知到 Confluence
你可能希望仅仅配置 Confluence 在 workbox 中仅仅显示自己的通知,禁用在 workbox 中显示从 Jira 来的通知.有可能这个 Jira 的应用已经通过应用链接功能正确链接到 C ...
- 用echarts写的轨迹图demo
轨迹图预览: [下载地址]:https://github.com/zhangzn3/trail-graph.git
- vue之node.js的简单介绍
一.什么是node.js? 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 二.安装 1.node.js的特性: - 非阻塞IO模型 - ...
- 【python】内存相关
1. /proc/pid/status 可以查看进程相关的详细信息,当内存异常时可查看 参考:http://blog.csdn.net/beckdon/article/details/4849190 ...
- 【python】gevent协程例子
说在前面:用协程还是多线程需要仔细考量.我在做实验时请求了100w个ip,分别用pool为1000的协程和64个线程来跑,结果是多线程的速度是协程的10倍以上. 一个简单的协程例子 #!/usr/bi ...