CF697D-Puzzles
题目
一棵树,从根节点开始dfs,每层以随机顺序进入每个子节点,问走到每个点的时候期望经过了多少个点。
(这里经过多少个点指的是经过多少个不同的点,即经过一个点多次算一个)
(其实这个题不如说求期望dfn序)。
\(n\le 10^5\)。
分析
一个很明显的思路就是:\(f[x]=1+f[fa]+绕来绕去期望经过的点个数\) 。从上往下dfs,问题就转化成了如何求每一个点\(x\)进入其子节点\(v\)之前期望经过的点个数。设绕来
绕去期望经过点个数为\(g[x]\) ,它的父亲有\(n\)个子节点。
计算这个东西有两种思路:
思路1
注意到这是一个dfs,所以我们如果进了一颗子树,那么它会走完整个子树再出来,而这个子树之前是没有走过的,即点数增加了\(\text{size}[v]\) 。(\(v\)为与\(x\)同父亲的点)
这样我们就可以通过枚举之前走进了多少个子树来求:
g[x]&=\sum _{i=1}^{n-1} 任意不含x的i个的size的和*\frac{1}{n}*\frac{1}{n-1}*\cdots*\frac{1}{n-i} \\
&=\sum _{i=1}^{n-1} \frac{(n-i-1)!}{n!}\sum _{v\ne x}i*size[v]* A_{n-2}^{i-1} \\
&=\sum _{i=1}^{n-1} \frac{(n-i-1)!}{n!}\sum _{v\ne x}i*size[v]* \frac{(n-2)!}{(n-i-1)!} \\
&=\sum _{v\ne x}size[v] \sum _{i=1}^{n-1}\frac{(n-2)!}{n!} \\
&=\frac{1}{2}\sum _{v\ne x}size[v]
\end{aligned}
\]
思路2
把从\(x\)父亲进入这一层的顺序列出来,所有情况是它的全排列。\(x\)前面有\(i\)个数的概率为\(\frac{1}{n}\), 前面\(i\)个数的和的期望为\(\frac{i\sum _{v\ne x}size[v]}{n-1}\),所以所有情况为
g[x]&=\frac{1}{n}*\frac{\sum _{i=1}^{n-1}i\sum _{v\ne x}size[v]}{n-1} \\
&=\frac{1}{2}\sum _{v\ne x}size[v]
\end{aligned}
\]
代码
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e5+1;
vector<int> g[maxn];
double f[maxn];
int size[maxn];
inline void add(int x,int y) {g[x].push_back(y);}
int Size(int x) {
int &sz=size[x]=1;
for (int v:g[x]) sz+=Size(v);
return sz;
}
void dfs(int x) {
for (int v:g[x]) f[v]=1.0+f[x]+(double)(size[x]-size[v]-1)/2.0,dfs(v);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int n=read();
for (int i=2;i<=n;++i) add(read(),i);
f[1]=1;
Size(1);
dfs(1);
for (int i=1;i<=n;++i) printf("%.2lf%c",f[i]," \n"[i==n]);
return 0;
}
CF697D-Puzzles的更多相关文章
- [CF697D]Puzzles 树形dp/期望dp
Problem Puzzles 题目大意 给一棵树,dfs时随机等概率选择走子树,求期望时间戳. Solution 一个非常简单的树形dp?期望dp.推导出来转移式就非常简单了. 在经过分析以后,我们 ...
- [CF161D]Distance in Tree-树状dp
Problem Distance in tree 题目大意 给出一棵树,求这棵树上有多少个最短距离为k的点对. Solution 这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树 ...
- codeforces A. Puzzles 解题报告
题目链接:http://codeforces.com/problemset/problem/337/A 题意:有n个学生,m块puzzles,选出n块puzzles,但是需要满足这n块puzzles里 ...
- What are the 10 algorithms one must know in order to solve most algorithm challenges/puzzles?
QUESTION : What are the 10 algorithms one must know in order to solve most algorithm challenges/puzz ...
- C puzzles详解
题目:http://www.gowrikumar.com/c/ 参考:http://wangcong.org/blog/archives/291 http://www.cppblog.com/smag ...
- codeforces 377A. Puzzles 水题
A. Puzzles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/33 ...
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- 《algorithm puzzles》——谜题
这篇文章开始正式<algorithm puzzles>一书中的解谜之旅了! 狼羊菜过河: 谜题:一个人在河边,带着一匹狼.一只羊.一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船空 ...
- 《algorithm puzzles》——概述
这个专题我们开始对<algorithm puzzles>一书的学习,这本书是一本谜题集,包括一些数学与计算机起源性的古典命题和一些比较新颖的谜题,序章的几句话非常好,在这里做简单的摘录. ...
- Puzzles
Puzzles Barney lives in country USC (United States of Charzeh). USC has n cities numbered from 1 thr ...
随机推荐
- 20155310 2016-2017-2 《Java程序设计》第四周学习总结
20155310 2016-2017-2 <Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复 ...
- (三)Hololens Unity 开发之 语音识别
学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (三)Hololens Unity 开发之 语音识别 Hol ...
- Maven学习(十四)-----Maven 构建配置文件
Maven 构建配置文件 什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文 ...
- fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart ...
- 【坚持】Selenium+Python学习之从读懂代码开始 DAY2
2018/05/10 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) #No.1 # 二次方程式 ax**2 + bx + ...
- mysql5.5 升级到 5.7 的坑
1.大概思路,docker 新启一个mysql5.7 端口映射到3307 2. 导出5.5 的.sql文件,导入5.7中 3.测试通过后,可将5.5关闭.5.7端口改回3306 GRANT ALL P ...
- js页面跳转,url带url参数解决方案
今天,在做一个项目的时候,向后端发送了一个Ajax请求,后端返回了一个字符串,告诉我未登录.那么我需要跳转到登录页面,同时告诉登录页面,登录成功后,需要跳回的url.也就是标题所说,url中的一个参数 ...
- 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09
作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09 据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...
- Java:有关try、catch和finally的学习(供自己参考)
Java:有关try.catch和finally的学习 在看到书本的时候对finally的介绍是:不论是否在try块中产生异常,都会执行finally.当时对这句话的理解不够深,误以为在try...c ...
- s2sh乱码一个小处理(新手按流程走)
解决乱码几小点: 1.配置过滤器,可以选择自己写,既然你用的SSH框架就更简单了,直接用Spring的过滤器,web.xml里配置一下即可. 2.Jsp页面设置编码,所有地方都要相同,我习惯用GBK ...