[ SHOI 2012 ] 随机树
\(\\\)
\(Description\)
开始有一棵只有一个根节点的树。每次随机选择一个叶子节点,为他添上左右子节点,求:
- 生成一棵有\(N\)个叶节点的树,所有叶节点平均高度的期望。
- 生成一棵有\(N\)个叶节点的树,树高的期望。
约定根节点深度为\(0\)。
- \(N\in [1,100]\)
\(\\\)
\(Solution\)
果然还是太菜了只会抄题解 一道期望和概率间巧妙转化的好题。
\(\\\)
第一问,平均的性质。
考虑每次扩展会随机选择一个叶节点,假设该叶节点的深度为\(d_i\),对总叶节点深度和的贡献为\((d_i+1)\times 2-d_i=d_i+2\)。
等概率的选择,对深度的平均值增量之和\(=\frac{\sum_{v\in Leaf}d_v+2}{|Leaf|}=2+\frac{\sum_{v\in Leaf}d_v}{|Leaf|}=2+ave\)。所以一次扩展节点对期望的增量是\(\frac{ave+2}{|Leaf|}\)。
设\(g[i]\)表示\(i\)个叶节点的深度平均值的期望,有
\]
愉快的递推就好。
\(\\\)
第二问,一种期望向概率的转化。
先考虑一种期望的表示方式。
\]
关于证明,第一个等号显然成立。
第二个等号可以理解为,每个概率会被累加权值那么多次。
第三个等号可以理解为,越大的权值对应的概率被累加的越多,当可取的权值\(+1\)时,对应的所有小于它的数字都会累加上一份最大权的概率,但是小于最大权的数字个数为最大权\(-1\),所以还需要累加上一份。
于是设\(f_i\)表示大于等于\(i\)的概率,进一步转化有
\]
思考如何用这个性质求解树高期望。
将状态定义为一种基于最小值的设计方式。设\(f[i][j]\)表示,有\(i\)个叶节点的树,树高\(\ge j\)的期望,答案有
\]
原理和上面是一样的。
考虑如何求\(f\)数组。有边界\(f[i][0]=1.0\ \big |\ i\in [1,N]\),因为任意时刻树高都会\(\ge 0\)。
然后将任务下放到子树,左右子树的大小分布是等概率的,注意只要不是叶节点就一定左右子树都有。
所以只要有一棵深度合法就好,注意容斥掉两种情况重合时的部分。
\]
好像漏掉了关于前面系数为什么是\(\frac{1}{i-1}\)的问题,发现问题被巨佬diss之后又上了一波百度,发现没有...
问了学长,证明大概是,考虑用\(1\)表示扩展了一个左子树内节点,用\(0\)表示扩展了一个右子树内的节点,那么生成一个\(01\)序列的概率就可以表示成,\(\frac{1}{2}\times\frac{2(1)}{3}\times\frac{3(2)(1)}{4}\times...\),分子部分表示选择一个左子树\(/\)右子树节点的概率。
比如生成树序列\(00111\),概率可以表示成\(\frac{1}{2}\times\frac{2}{3}\times\frac{1}{4}\times\frac{2}{5}\times\frac{3}{6}\),注意到交换\(01\)位置得到的式子的值不变。
为什么呢?因为分母部分一定是\((i+1)!\),而分子部分一定是\(k!\times (i-k)!\),表示两棵子树的生成过程。
于是一个左子树大小为\(k\),右子树大小为\(n-k\)的树生成的概率就是\(\frac{k!\times(i-k)!}{(i+1)!}=\frac{1}{i+1}\),与\(k\)无关。
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 110
#define R register
using namespace std;
int n,q;
double g[N],f[N][N];
int main(){
scanf("%d%d",&q,&n);
if(q==1){
g[1]=0.0;
for(R int i=2;i<=n;++i) g[i]=g[i-1]+2.0/i;
printf("%.6lf",g[n]);
}
else{
for(R int i=1;i<=n;++i) f[i][0]=1.0;
for(R int i=2;i<=n;++i)
for(R int j=1;j<i;++j){
for(R int k=1;k<i;++k)
f[i][j]+=f[k][j-1]+f[i-k][j-1]-f[k][j-1]*f[i-k][j-1];
f[i][j]/=(i-1);
}
double ans=0.0;
for(R int i=1;i<=n;++i) ans+=f[n][i];
printf("%.6lf\n",ans);
}
return 0;
}
[ SHOI 2012 ] 随机树的更多相关文章
- [SHOI2012]随机树
[SHOI2012]随机树 题目大意( 网址戳我! ) 随机树是一颗完全二叉树,初始状态下只有一个节点. 随机树的生成如下:每次随机选择一个叶子节点,扩展出两个儿子. 现在给定一个正整数\(n\)(\ ...
- [python] RRT快速拓展随机树
""" version1.1,2018-05-09 <基于智能优化与RRT算法的无人机任务规划方法研究>博士论文 <基于改进人工势场法的路径规划算法研究 ...
- [matlab] 7.快速搜索随机树(RRT---Rapidly-exploring Random Trees) 路径规划
RRT是一种多维空间中有效率的规划方法.它以一个初始点作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点包含了目标点或进入了目标区域,便可以在随机树中找到一条由从初始 ...
- P3830 [SHOI2012]随机树 题解
P3830 随机树 坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了. 题目链接 P3830 [SHOI2012]随机树 题目描述 输入输出格式 输入格式: 输入仅有一行,包含两个正整数 q ...
- P3830 [SHOI2012]随机树
P3830 [SHOI2012]随机树 链接 分析: 第一问:f[i]表示有i个叶子结点的时候的平均深度,$f[i] = \frac{f[i - 1] + 2 + f[i - 1] * (i - 1) ...
- bzoj2830: [Shoi2012]随机树
题目链接 bzoj2830: [Shoi2012]随机树 题解 q1好做 设f[n]为扩展n次后的平均深度 那么\(f[n] = \frac{f[n - 1] * (n - 1) + f[n - 1] ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- matlab练习程序(快速搜索随机树RRT)
RRT快速搜索随机树英文全称Rapid-exploration Random Tree,和PRM类似,也是一种路径规划算法. 和PRM类似,算法也需要随机撒点,不过不同的是,该算法不是全局随机撒点,而 ...
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
随机推荐
- 使用nfs3将hdfs挂载到本地或远程目录(非kerberos适用)
最基本的配置方法,aix.kerberos等的操作详见http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Hdf ...
- 小数化分数的O(log2n)解法
具体约束: 给定一个小数x,x满足0<=x<1,且保证给定的x保留了18位小数 输出一个分数,使得分母不超过1e9,分子分母互质,且在满足这些条件的情况下最接近x 了解一下法雷数列和ste ...
- 过河(codevs 1155)
题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥 ...
- 【BZOJ4650&UOJ219】优秀的拆分(二分,hash)
题意: 思路: 在实现时SA可以用hash+二分代替,会多一个log BZ上跑的飞快,但UOJ上extra卡出翔,已经放弃 不过转C或者写SA没准就过了 看来转C迫在眉睫 ; ..]of int64; ...
- 如何取消codeblocks对msvcr100.dll的依赖?
用VS2010或是codeblocks开发的程序,在开发之外的机器上,可能会提前缺少msvcr100.dll之类的文件. 可以用如何设置,取消其对库文件的依赖. 当然,还要注意创建程序的类型.(补) ...
- 洛谷—— P2330 [SCOI2005]繁忙的都市
P2330 [SCOI2005]繁忙的都市 题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路 ...
- zabbix全方位监控MySQL +cacti监控mysql
http://www.linuxidc.com/Linux/2015-02/112690.htm http://john88wang.blog.51cto.com/2165294/1596272?ut ...
- vue2源码浏览分析02
1.组件初始化方法 init Vue.prototype._init = function (options) { /* istanbul ignore if */ if ("develop ...
- 【C语言】模拟实现strcmp函数
//模拟实现strcmp函数 //str1>str2,返回1 //str1=str2,返回0 //str1<str2,返回-1 #include <stdio.h> #incl ...
- addSubview和insertSubview 区别
子视图是以栈的方式存放的. 每次addsubview时都是在最后面添加. 每次在addsubview前和addsubview后可以看看[self.view.subViews count]: 你看看你 ...