Codeforces.643E.Bear and Destroying Subtrees(DP 期望)
\(Description\)
有一棵树。Limak可以攻击树上的某棵子树,然后这棵子树上的每条边有\(\frac{1}{2}\)的概率消失。定义 若攻击以\(x\)为根的子树,高度\(ht(x)\)为\(x\)子树剩余点(与x连通)的最大深度。共\(q\)次操作,两种:
\(1\ x\).新建一个节点,其父节点为\(x\)。
\(2\ x\).询问若攻击以\(x\)为根的子树,\(x\)子树的期望高度。
\(q\leq 5\times10^5\)。允许有一定精度误差。
\(Solution\)
首先我们不需要考虑很大的高度\(h\),假如\(h=100\),同时存在\(100\)条边的概率非常小。先假设需考虑的最大高度\(MAX\_H=60\)。
对于询问,只要\(x\)有一个子树的高度为\(h\)且其它子树高度不超过\(h\),就可以用\(p*h\)更新答案。
so记\(f[x][h]\)表示以\(x\)为根,\(ht(x)\leq h\)的概率。则答案为\(\sum_{h=1}^{MAX\_H}h\times(f[x][h]-f[x][h-1])\)。
对于新建节点,沿着\(fa\)一直更新最多\(MAX\_H\)次。
\(f[x][h]\)自然是从\(f[son_x][h-1]\)转移。每个子节点\(v\)有两种情况,一是存在边,对\(f[x][h]\)贡献\(\frac{1}{2}\times f[v][h-1]\);二是不存在该边,概率为\(\frac{1}{2}\)。
更新时当然不能\(2^n\)枚举子节点。类似多项式,把\(n\)项乘在一起,即\[f[x][h]=\prod_{v=son_x}(\frac{1}{2}+\frac{1}{2}f[v][h-1])\]
所以更新的时候把原来的项除掉再乘上新的项就可以了。
对于\(MAX\_H\)的取值,你可能会认为\(30\)就足够了,因为\(\frac{1}{2^{30}}\)已经足够小。事实上,考虑一个菊花图,从根节点延伸出\(\frac{n}{31}\)条路径,且每条路径长度为\(31\)。那么以\(1\)为根树深为\(31\)的概率为:\[1-(1-\frac{1}{2^{31}})^{\frac{n}{31}}\]
这是大于\(10^{-6}\)的。
http://www.wolframalpha.com/input/?i=1+-+(1-(1%2F2)%5Ed)%5E(N%2Fd)+for+N+%3D+500000+and+d+%3D+31


复杂度\(O(q*MAX\_H)\)
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAX_H 60
const int N=5e5+5;
int n,fa[N];
double f[N][MAX_H];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
n=1;
for(int i=0; i<MAX_H; ++i) f[1][i]=1;
for(int Q=read(),x; Q--; )
{
if(read()==1)
{
fa[++n]=x=read();
for(int i=0; i<MAX_H; ++i) f[n][i]=1;
double tmp1=f[x][0],tmp2;
f[x][0]*=0.5;//深度还是不超过1啊
for(int Fa=fa[x],i=1; Fa&&i<MAX_H; Fa=fa[x=Fa],++i)
{
tmp2=f[Fa][i];
f[Fa][i] /= 0.5 + 0.5*tmp1;
f[Fa][i] *= 0.5 + 0.5*f[x][i-1];
tmp1=tmp2;
}
}
else
{
x=read(); double ans=0;
for(int i=1; i<MAX_H; ++i) ans+=(f[x][i]-f[x][i-1])*i;
printf("%.10lf\n",ans);
}
}
return 0;
}
Codeforces.643E.Bear and Destroying Subtrees(DP 期望)的更多相关文章
- CF643E. Bear and Destroying Subtrees 期望dp
题目链接 CF643E. Bear and Destroying Subtrees 题解 dp[i][j]表示以i为根的子树中,树高小于等于j的概率 转移就是dp[i][j] = 0.5 + 0.5 ...
- CF 643 E. Bear and Destroying Subtrees
E. Bear and Destroying Subtrees http://codeforces.com/problemset/problem/643/E 题意: Q个操作. 加点,在原来的树上加一 ...
- 笔记-CF643E Bear and Destroying Subtrees
CF643E Bear and Destroying Subtrees 设 \(f_{i,j}\) 表示节点 \(i\) 的子树深度为 \(\le j\) 的概率,\(ch_i\) 表示 \(i\) ...
- [CF643E]Bear and Destroying Subtrees(期望,忽略误差)
Description: 给你一棵初始只有根为1的树 两种操作 1 x 表示加入一个新点以 x为父亲 2 x 表示以 x 为根的子树期望最深深度 每条边都有 \(\frac{1}{ ...
- CF643E Bear and Destroying Subtrees
题解 我们可以先写出\(dp\)式来. 设\(dp[u][i]\)表示以\(u\)为根的子树深度不超过\(i-1\)的概率 \(dp[u][i]=\prod (dp[v][i-1]+1)*\frac{ ...
- [cf674E]Bear and Destroying Subtrees
令$f_{i,j}$表示以$i$为根的子树中,深度小于等于$j$的概率,那么$ans_{i}=\sum_{j=1}^{dep}(f_{i,j}-f_{i,j-1})j$ 大约来估计一下$f_{i,j} ...
- Codeforces 771E Bear and Rectangle Strips DP
题意: 一个由大写字母组成的长度为\(n(n \leq 75)\)的字符串,每次操作可以交换相邻位置的两个字母,求最少操作多少次使字符串中不出现子串VK 分析: VK之外的字母具体是什么,我们并不关心 ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
随机推荐
- 阿里云ECS使用cloudfs4oss挂载OSS
cloudfs4oss可以帮我们将OSS直接挂载到ECS上,就像一个目录一样方便访问.使用方法: 1.安装配置环境: yum install libcurl libcurl-devel openssl ...
- Linux之chkconfig命令
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- eclipse 下编译c++
下载jdk 下载eclipse for c++ 版本 下载mingw ps:show project types... 这个选项不要打钩
- jenkins设置CSRF 协议(CRUMB值设置)
在关闭“”调用出现Error 403 No valid crumb was included in the request 第一种解决方式是 关闭 csrf,如上图,去掉勾就可以,但是并不推荐. 第二 ...
- Spring Tool Suite 创建 SpringMVC+Maven 项目(一)!
使用Spring Tool Suite 创建 SpringMVC Web 项目,使用Maven来管理依赖! 首先对环境进行必要的配置 1. 配置必要的Java JDK版本! (菜单栏-窗口-首选项.) ...
- argunlar 1.0.1 【数据绑定】
<!DOCTYPE html><html lang="en" ng-app><head> <meta charset="U ...
- 20155303 2016-2017-2 《Java程序设计》第五周学习总结
20155303 2016-2017-2 <Java程序设计>第五周学习总结 教材学习中的问题和解决过程 『问题一』:受检异常与非受检异常 『问题一解决』: 受检异常:这种在编译时被强制检 ...
- 【转】把Git Repository建到U盘上去
CHENYILONG Blog 把Git Repository建到U盘上去 转 把Git Repository建到U盘上去 Git很火.原因有三: 它是大神Linus Torvalds的作品,天然地具 ...
- shell 检测安装包
检测 wget 是否存在 rpm -q wget >/dev/null ];then echo "install wget,Please wait..." yum -y in ...
- ftp 服务
ftp 上传下载 yum install ftp -y ftp:192.168.1.1 上传 put file1 下载 get file2 直接方式 ftp get test.tar.gz 文件 ft ...