【CodeForces - 697D】Puzzles(树形dp,期望dp)
题目大意:
给定一棵树,从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)相关推荐
- 插头DP 概率DP / 期望DP
插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...
- Codeforces 494D Birthday 树形dp (看题解)
Birthday 没想到平方和能在树上dp出来的... 知道了如何转移, 那么就很好写了... #include<bits/stdc++.h> #define LL long long # ...
- 动态规划报告(树形DP+概率DP
动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...
- poj 2096 , zoj 3329 , hdu 4035 —— 期望DP
题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...
- CF 1324-F Maximum White Subtree //树形换根dp
题目链接 http://codeforces.com/problemset/problem/1324/F 题意 给你一棵树( n n n 个顶点)和一个数组 a i a_i ai,每个顶点要不是白色 ...
- Codeforces 1179D Fedor Runs for President [DP,斜率优化]
Codeforces 思路 考虑把连的那两个点中间的链提出来,那么就会变成一条链,链上的每个点挂着一棵子树的形式. 设那些子树的大小为\(S_1,S2,\cdots\),那么新加的简单路径个数就是 \ ...
- luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...
- [SCOI2008]奖励关(期望dp)
你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...
- 【bzoj4318】OSU! 期望dp
题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...
最新文章
- 包子和饺子之扫地机器人_扫地机器人和体重秤在一起,能生出什么宝宝? | 爆笑囧图...
- 程序员上班啥也不干年入140万,网友:这操作绝了!
- python重现 mysql server has gone away错误以及解决方案
- shell的学习和命令使用入门
- 加载异常图片导致系统重启之迷
- 基于Apache POI 向xlsx写入数据
- ming window 交叉编译_opencv3编译pc端及交叉编译arm端
- linux内核工程师必须知道的三十道题
- 街霸5 android,MD街头霸王5免安装版
- shell编程:笔记*
- .NET程序中常用的28种代码
- 谈java之GUI与安卓
- WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector)的使用
- 数据库课程设计 医院管理系统 SQL
- 两个列向量相乘怎么计算_两个矩阵相乘怎么算?
- 用C#去读取陀螺仪姿态角度传感器JY61的串口数据
- 微信定位和HTML5定位
- 微信个人订阅号简单实现在线收款
- mongodb 10、mongodb从节点失联解决方法
- mysql/mariadb 进阶知识之表设计和查询
热门文章
- iframe 自适应高度 跨域
- 5分钟能回答的人,年薪25万美金以上
- 【数据结构与算法】复杂度分析
- [Leetcode]第[43]题[JAVA][字符串相乘][字符串相加]
- HDU-4278 Faulty Odometer 数学递推 || 八进制
- Java学习笔记7-2——注解与反射
- matlab win10 gpu加速,win10的Edge浏览器设置GPU硬件加速,大幅度提升浏览器性能
- 工厂方法模式_1天1个设计模式——工厂方法模式
- fir fpga 不同截止频率_学习FPGA将来的出路在哪里?
- mysql 自动备份删除_mysql自动备份删除5天前的备份