转一篇CF题目的博客
2016-07-17 00:03
176 查看
题意:
给你一颗n(n<=10^5)个节点树根为1的树,然后进行dfs,求每个点,在dfs中被访问时间的期望。
我们求的就是starting_time[v]的期望pv。
题解:
我们来求一下节点2的期望。
1、我们知道我们要先通过2节点的父亲1才能到2。但2节点什么时候访问是不固定的。
我们假设ri代表i为根的子树,我们能得到下列六种访问次序:
r2 r4 r5
r2 r5 r4
r4 r2 r5
r5 r2 r4
r4 r5 r2
r5 r4 r2
对应的2节点的starting_time[v]分别为2,2,5,3,6,6.我们能得到2节点的期望为p[2]=(2+2+5+3+6+6)/6=4.0
2、但是我们不能这样算,其实我们可以来算r4和r5给2节点的贡献:p[2]=p[1]+1+(3*size(r4)+3*size(r5))/6。
我们发现r4和r5各有一半的情况是出现在2节点的前面的。我们就得出了递推公式:
p[i]=p[fa[i]]+1+(size(fa[i])-size(i)-1)/2 从根节点dfs下来就可以了。
给你一颗n(n<=10^5)个节点树根为1的树,然后进行dfs,求每个点,在dfs中被访问时间的期望。
let starting_time be an array of length n current_time = 0 dfs(v): current_time = current_time + 1 starting_time[v] = current_time shuffle children[v] randomly (each permutation with equal possibility) // children[v] is vector of children cities of city v for u in children[v]: dfs(u)
我们求的就是starting_time[v]的期望pv。
题解:
我们来求一下节点2的期望。
1、我们知道我们要先通过2节点的父亲1才能到2。但2节点什么时候访问是不固定的。
我们假设ri代表i为根的子树,我们能得到下列六种访问次序:
r2 r4 r5
r2 r5 r4
r4 r2 r5
r5 r2 r4
r4 r5 r2
r5 r4 r2
对应的2节点的starting_time[v]分别为2,2,5,3,6,6.我们能得到2节点的期望为p[2]=(2+2+5+3+6+6)/6=4.0
2、但是我们不能这样算,其实我们可以来算r4和r5给2节点的贡献:p[2]=p[1]+1+(3*size(r4)+3*size(r5))/6。
我们发现r4和r5各有一半的情况是出现在2节点的前面的。我们就得出了递推公式:
p[i]=p[fa[i]]+1+(size(fa[i])-size(i)-1)/2 从根节点dfs下来就可以了。
相关文章推荐
- 简单谈谈.NET Core跨平台开发
- myeclipse修改编码大全
- VS2015在升级到Update2之后运行Cordova项目异常的解决方案
- VS2015 update2安装历程
- VS2015 Update2 构建 Android 程序问题汇总
- cc、gcc、g++、CC的区别概括(好文章)
- MYSQL神秘的HANDLER命令与实现方法
- 《口袋妖怪》是如何一夜爆火的?
- 不懂“细节”的产品经理不是好设计师
- 以华为为例告诉你HRBP 到底是什么?
- 从零开始打造一个Android 3D立体旋转容器
- Nginx 工作原理和优化、漏洞
- POJ 1050最大子矩阵和
- 如何学习编程和转行
- 运营的两种核心逻辑,你会相信哪一种?
- 分享磨砺营马剑威老师讲解Android通信中几种交互方式
- c++ map跟vector的相关用法
- c++常用函数
- html之内联元素与块状元素
- Chrome firefox ie等浏览器空格 宽度不一样怎么办