[SHOI2012]随机树
[SHOI2012]随机树
题目大意( 网址戳我! )
随机树是一颗完全二叉树,初始状态下只有一个节点。
随机树的生成如下:每次随机选择一个叶子节点,扩展出两个儿子。
现在给定一个正整数\(n\)(\(n \le 100\)) , 询问叶子节点个数为\(n\)的随机树:
- \(q = 1\) :叶子节点的平均深度
- \(q = 2\) :整棵随机树的平均深度
样例:\(cin\ q\ n\ \ \ \ ;cin\ 1\ 4\ ,\ put\ 2.166667\ \ \ ;\ \ \ cin \ 2 \ 4\ ,\ put\ 2.666667\ \ \ ;\)
解题思路
\(solve_a\): \(q = 1\) (叶子节点平均深度)
设\(f(x)\)表示扩展了\(x\)次后的叶子节点平均深度。
那么求\(f(x)\)时 , 直接把新扩展的节点深度设为 \(f(x-1)\) 不就行了吗?
转移:
\(f(x) = \frac{1}{x} (\ f(x-1)*(x-1) - f(x - 1) + (f(x-1)+1)*2\ )\)
把它展开后:
\(f(x) = f(x - 1) + \frac{2}{x}\) , 初始值:\(f(0) = 0\) ;
\(solve_b\): \(q = 2\) (整棵树的平均深度)
整数概率公式:\(E(x) = \sum_{i=1}^{\infty} P(x \ge i)\)
所以只要求随机树层数大于等于\(i\)层的概率即可。
我们脱离扩展,改为构建一颗有\(n\)个叶子节点,问层数大于等于\(i\)层的概率。
设\(f[x][d]\)表示有\(x\)个叶节点,树深度大于等于\(d\)的概率。
那么每次通过添加根来提升层数 , 枚举左右儿子分配多少个叶子节点即可。
转移:
\[f[x][d] = \frac{1}{x-1}\sum_{i=1}^{x-1} = f[i][d-1] + f[x-i][d-1] - f[i][d-1]*f[x-i][d-1]\]
就是小学容斥原理 , 然后初值为:\(f[x][0] = 1.0\)
实现代码:
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define _ 101
using namespace std;
double f[_][_],res,ans; int q , n ;
IL void solve1(){
for(RG int i = 2; i <= n; i ++) res += 2.0 / (double)i ;
printf("%.6lf" , res) ; return ;
}
IL void solve2(){
for(RG int x = 1; x <= n; x ++)f[x][0] = 1.0;
for(RG int x = 2; x <= n; x ++)
for(RG int d = 1; d <= x ; d ++){
for(RG int l = 1; l <= x - 1; l ++)
f[x][d] += f[l][d-1] + f[x-l][d-1] - f[l][d-1]*f[x-l][d-1] ;
f[x][d] /= (double)(x - 1) ;
}
ans = 0; for(RG int i = 1; i <= n; i ++)ans += f[n][i] ;
printf("%.6lf" , ans) ; return ;
}
int main(){
cin >> q ; cin >> n;
(q & 1) ? solve1() : solve2() ;
return 0;
}
[SHOI2012]随机树的更多相关文章
- 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] ...
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
- luogu3830 [SHOI2012]随机树
传送门:洛谷 题目大意:对于一个只有一个节点的二叉树,一次操作随机将这棵树的叶节点的下方增加两个节点.$n-1$次操作后变为$n$个叶节点的二叉树.求:(1)叶节点平均深度的期望值(2)树深度的数学期 ...
- luogu P3830 [SHOI2012]随机树
输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结点平均 ...
- [SHOI2012]随机树[期望dp]
题意 初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望. \(n\leq 100\) . 分析 对于第一问, ...
- 洛谷P3830 [SHOI2012]随机树(期望dp)
题面 luogu 题解 第一问: 设\(f[i]\)表示\(i\)步操作后,平均深度期望 \(f[i] = \frac {f[i - 1] * (i - 1)+f[i-1]+2}{i}=f[i-1]+ ...
- 【[SHOI2012]随机树】
感觉第一问就非常神仙,还有第二问怎么被我当成组合数学题来做了 首先是第一问 期望具有线性性,于是深度平均值的期望等于深度和的期望值的平均 设\(dp_x\)表示具有\(x\)个叶子节点的树的深度和的期 ...
随机推荐
- mongodb学习一
Windows 平台安装 MongoDB MongoDB 下载 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制 ...
- Spring基础篇——通过Java注解和XML配置装配bean
自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...
- Openwrt上使用dnsmasq和ipset实现域名分流
目标 部署一台自动代理路由器,实现根据域名来自动设定直连或者代理,而我要做的只是设置PC的默认网关为主路由器(192.168.0.1)还是自动代理路由器(192.168.0.254). 创建Openw ...
- Trie树 字典树-学习笔记
字符串--蒟蒻永远的阴影 对于字符串匹配 KMP很好的解决了以一个文本串匹配一个模板串的问题 但如果模板串有多个呢 这是KMP不再适用 我们引入一个新的数据结构--字典树 (当然又有像AC自动机这样更 ...
- 手机APP中使用history.back()返回没有效果的解决
样式是一个超链接A标签,通过点击事件来达到返回上一页的效果. 所以通常做饭是把A标签的href写成#,然后onClick事件,刚开始我只是当成一个普通点击事件,然后使用JS进行返回. 写法如下: &l ...
- 共享表空间VS独立表空间
基础概念:共享表空间 VS 独立表空间 [共享表空间] 又称为system tablespace系统表空间,a small set of data files (the ibdata files) . ...
- 通过修改注册表设置windows环境变量
开发环境搭建每次都要设置很多环境变量, 一般是通过 [菜单]->[计算机]->[属性]->[高级设置]->[环境变量]进行设置,重装系统后,每次都要设置很多环境变量,很麻烦. ...
- 二叉排序树、平衡二叉树、B树&B+树、红黑树的设计动机、缺陷与应用场景
之前面试时曾被问到"如果实现操作系统的线程调度应该采用什么数据结构?",因为我看过ucore的源码,知道ucore是采用斜堆的方式实现的,可以做到O(n)的插入.O(1)的查找.我 ...
- Sublime Text编辑远程Linux服务器上的文件
sublime有个叫sftp的插件,可以通过它直接打开远程机器上的文件进行编辑,并在保存后直接同步到远程linux服务器上. 用Package Control安装插件 按下Ctrl+Shift+P调出 ...
- CentOS命令修改系统时间同步
使用Centos,遇到本地时间对不上,直接敲命令:date -s "2016-01-08 15:15:15"是立即生效了,但是重启后,系统时间还是原来的. 修改了其一是没有办法奏 ...