【Codeforces 696B】【JZOJ 4647】寻找
来源:互联网 发布:mysql hadoop实时同步 编辑:程序博客网 时间:2024/05/03 14:07
Description
他们度蜜月的地方是一棵树,共有N个节点,Bob会使用下列DFS算法对该树进行遍历。
starting_time是一个容量为n的数组current_time = 0dfs(v): current_time = current_time + 1 starting_time[v] = current_time 将children[v]的顺序随机排列 (每个排列的概率相同) // children[v]v的直接儿子组成的数组 for u in children[v]: dfs(u)
1是这棵树的根,Bob会从1出发,即运行dfs(1),现在他想知道每个点starting_time的期望值。
Analysis
设当前要算v的期望,已经算出了v的father的期望,把那些排列写出来,仔细观察,可以将排列按v在当前其兄弟的列表中的出现位置分类。设v及其兄弟共有n个,sum表示v的兄弟的大小和。
可以得出这样一个式子
化简之后就成了
Code
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define efo(i,v) for(int i=last[v];i;i=next[i])using namespace std;const int N=100010,M=N*2;int n,tot,to[M],next[M],last[N],size[N];double f[N];void link(int u,int v){ to[++tot]=v,next[tot]=last[u],last[u]=tot;}void dfs1(int v,int from){ size[v]=1; efo(i,v) { int u=to[i]; if(u==from) continue; dfs1(u,v); size[v]+=size[u]; }}void dfs(int v,int from){ efo(i,v) { int u=to[i]; if(u==from) continue; f[u]=f[v]+1+(size[v]-1-size[u])/2.0; dfs(u,v); }}int main(){ int x; scanf("%d",&n); fo(i,2,n) { scanf("%d",&x); link(i,x),link(x,i); } dfs1(1,0); f[1]=1; dfs(1,0); fo(i,1,n) printf("%.1lf ",f[i]); return 0;}
0 0
- 【Codeforces 696B】【JZOJ 4647】寻找
- 【Codeforces 696B】Another Sith Tournament &【JZOJ 4647】寻找
- JZOJ.4647 寻找
- Codeforces 103B. Cthulhu 寻找奈亚子
- JZOJ 4647 寻找 【NOIP2016提高A组模拟7.17】
- 【JZOJ 4932】B
- 【JZOJ 4932】 B
- 【JZOJ 5219】 B
- JZOJ 7.9B组
- 【JZOJ 5223】 B
- 【JZOJ 4446】B
- jzoj 2017.8.7 B
- Codeforces-696B Puzzles
- JZOJ 4.1 B组 俄罗斯方块
- JZOJ 8.7 B组总结
- JZOJ 8.8 B组总结
- JZOJ 8.10 B组总结
- JZOJ 8.14 B组总结
- 布隆过滤器 -- 空间效率很高的数据结构
- Ubuntu14.04下安装Caffe总结
- Spark的广播和累加器的使用
- $('div p')、$('div>p')、$(div+span)的用法和区别
- Rxjava入门
- 【Codeforces 696B】【JZOJ 4647】寻找
- Java 匿名类不能拥有一个构建器
- mysql sql_mode小分享
- Hibernate经验
- Saucelabs+Java+TestNG+Appium+Maven+Git+Jenkins+ReportNG for Android 自动化测试
- C#静态类的使用[简单]
- 分段控件的属性详解
- AudioRecord实现"助听器"
- Spark学习(2)