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 ...
随机推荐
- HBase基础架构及原理
1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...
- 前端-----JavaScript 初识基础
JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:操作网页上的 ...
- Ex 2_22 两个有序列表合并后的第k小元素..._第四次作业
package org.xiu68.ch02; public class Ex2_22 { public static void main(String[] args) { // TODO Auto- ...
- Codeforces Educational Codeforces Round 57 题解
传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...
- Swift 学习- 07 -- 函数
// 函数 // 函数是一段完成特定任务的独立代码片段, 你可以通过给函数命名来标识某个函数的功能, 这个名字可以被用来在需要的时候'调用'这个函数来完成它的任务 // swift 统一的函数语法非常 ...
- 暑假里的第八篇Java
日期:2018.9.1 博客期:008 星期六 这几天刚到学校,Java方面写的少了!目前在做老师头放假前发布的那一套题目,就是哪个Java程序测试卷.至于自己能不能都做出来我自己心里十分清楚!今天就 ...
- JavaScript(JS)之简单介绍
一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...
- 剑指offer 二叉树的层序遍历
剑指offer 牛客网 二叉树的层序遍历 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 09:33:16 2019 @ ...
- MySql在windows上的安装
知乎安装教程 csdn安装教程 一.官网下载 ZIP Archive 内的软件包,mysql-xxx-win64.zip. 二.新建 MySQL 文件夹,解压缩下载包,进入文件夹(mysql-8.0. ...
- selenium 无法启动IE
解决办法是IE选项设置的安全页中,4个区域的启用保护模式的勾选都去掉(或都勾上)