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 ...
随机推荐
- 简单的Slony-I设置实例 II
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...
- 【转载】漫谈C++:良好的编程习惯与编程要点
原文: 漫谈C++:良好的编程习惯与编程要点 阅读目录 以良好的方式编写C++ class Class with pointer member(s):记得写Big Three static与类 正文 ...
- ELKStack入门篇(二)之Nginx、Tomcat、Java日志收集以及TCP收集日志使用
1.收集Nginx的json格式日志 1.1.Nginx安装 [root@linux-node1 ~]# yum install nginx -y [root@linux-node1 ~]# vim ...
- 让div跟着鼠标移动
朋友求助帖 具体实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- crontab练习题
Crontab练习题 每周一到周六的凌晨3点20分,运行tar命令对/etc/目录进行存档另存,存储位置为/backups/etc-YYYY-MM-DD.tar.gz 20 3 * * 1-6 /us ...
- php编程知识点2018
一 .PHP基础部分 1.PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows.Linux等)上配 ...
- [C++基础] tips
1. 在g++ 中使支持C++11 https://askubuntu.com/questions/773283/how-do-i-use-c11-with-g This you can do by ...
- win7重装系统后设置Python2.7环境
起因 台式机的主板莫名出现问题,显示器画面卡顿不能动,鼠标键盘无反应,在这种情况下只好按住电源键断电.下面重启后,显示器无画面,猜测开机后没有进BIOS.然后就拆机箱,拔下电源线后撬起主板电池几秒再放 ...
- Druid Monitor小记
继上篇DruidDataSource源码分析之后 , 公司又要求做一个Druid的数据库监控 , 以及spring监控 , 研究一小时 , 总结出了一点经验 , 特此贴出来分享一下 一 . 利用Dru ...
- C++ map 遍历
#include <iostream> #include <map> using namespace std; int main(){ map<int,int> m ...