题目大意:

给定一棵树,从1开始,按DFS的方式访问这棵树 
每次从父亲节点随机访问儿子,问每个节点被访问到的时间的期望

输入:第一行一个数n,代表n个节点。第二行n-1个数p2,p3,p4,p5...,pn-1,其中pi代表i号节点的父节点编号,1号节点一定是根节点。

Examples

Input

7
1 2 1 1 4 4

Output

1.0 4.0 5.0 3.5 4.5 5.0 5.0

Input

12
1 1 2 2 4 4 3 3 1 10 8

Output

1.0 5.0 5.5 6.5 7.5 8.0 8.0 7.0 7.5 6.5 7.5 8.0 

解题报告:

假设当前考虑的是根节点u,对于根节点的子节点,随机产生的一个排列当访问序列,对于某个儿子v,考虑其任意一个兄弟b,该兄弟在其前面的概率均为 1/2。所以这个兄弟对期望的贡献为size(b) ,考虑完所有兄弟,对期望的贡献即为 size[u]-size[v] 
所以期望即为 dp[u]+1+size[u]-size[v]。两遍dfs即可。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n,fa[MAX],size[MAX];
double dp[MAX];
vector<int> vv[MAX];
void dfs(int u,int f) {int up = vv[u].size();size[u] = 1;for(int i = 0; i<up; i++) {int v = vv[u][i];if(v == f) continue;dfs(v,u);size[u] += size[v];}}
void dfs2(int u,int f) {int up = vv[u].size();for(int i = 0; i<up; i++) {int v = vv[u][i];if(v == f) continue;dp[v] = dp[u] + 1 + (size[u]-size[v]-1)/2.0;dfs2(v,u);}
}
int main()
{cin>>n;for(int i = 2; i<=n; i++) {        scanf("%d",fa+i);vv[fa[i]].pb(i);} dfs(1,0);dp[1]=1;dfs2(1,0);for(int i = 1; i<=n; i++) printf("%.2f ",dp[i]);return 0 ;
}

【CodeForces - 697D】Puzzles(树形dp,期望dp)相关推荐

  1. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  2. Codeforces 494D Birthday 树形dp (看题解)

    Birthday 没想到平方和能在树上dp出来的... 知道了如何转移, 那么就很好写了... #include<bits/stdc++.h> #define LL long long # ...

  3. 动态规划报告(树形DP+概率DP

    动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...

  4. poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

    题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...

  5. CF 1324-F Maximum White Subtree //树形换根dp

    题目链接 http://codeforces.com/problemset/problem/1324/F 题意 给你一棵树( n n n 个顶点)和一个数组 a i a_i ai​,每个顶点要不是白色 ...

  6. Codeforces 1179D Fedor Runs for President [DP,斜率优化]

    Codeforces 思路 考虑把连的那两个点中间的链提出来,那么就会变成一条链,链上的每个点挂着一棵子树的形式. 设那些子树的大小为\(S_1,S2,\cdots\),那么新加的简单路径个数就是 \ ...

  7. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  8. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  9. 【bzoj4318】OSU! 期望dp

    题目描述 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...

最新文章

  1. 包子和饺子之扫地机器人_扫地机器人和体重秤在一起,能生出什么宝宝? | 爆笑囧图...
  2. 程序员上班啥也不干年入140万,网友:这操作绝了!
  3. python重现 mysql server has gone away错误以及解决方案
  4. shell的学习和命令使用入门
  5. 加载异常图片导致系统重启之迷
  6. 基于Apache POI 向xlsx写入数据
  7. ming window 交叉编译_opencv3编译pc端及交叉编译arm端
  8. linux内核工程师必须知道的三十道题
  9. 街霸5 android,MD街头霸王5免安装版
  10. shell编程:笔记*
  11. .NET程序中常用的28种代码
  12. 谈java之GUI与安卓
  13. WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector)的使用
  14. 数据库课程设计 医院管理系统 SQL
  15. 两个列向量相乘怎么计算_两个矩阵相乘怎么算?
  16. 用C#去读取陀螺仪姿态角度传感器JY61的串口数据
  17. 微信定位和HTML5定位
  18. 微信个人订阅号简单实现在线收款
  19. mongodb 10、mongodb从节点失联解决方法
  20. mysql/mariadb 进阶知识之表设计和查询

热门文章

  1. iframe 自适应高度 跨域
  2. 5分钟能回答的人,年薪25万美金以上
  3. 【数据结构与算法】复杂度分析
  4. [Leetcode]第[43]题[JAVA][字符串相乘][字符串相加]
  5. HDU-4278 Faulty Odometer 数学递推 || 八进制
  6. Java学习笔记7-2——注解与反射
  7. matlab win10 gpu加速,win10的Edge浏览器设置GPU硬件加速,大幅度提升浏览器性能
  8. 工厂方法模式_1天1个设计模式——工厂方法模式
  9. fir fpga 不同截止频率_学习FPGA将来的出路在哪里?
  10. mysql 自动备份删除_mysql自动备份删除5天前的备份