【64.52%】【codeforces 697D】Puzzles
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Barney lives in country USC (United States of Charzeh). USC has n cities numbered from 1 through n and n - 1 roads between them. Cities and roads of USC form a rooted tree (Barney’s not sure why it is rooted). Root of the tree is the city number 1. Thus if one will start his journey from city 1, he can visit any city he wants by following roads.
Some girl has stolen Barney’s heart, and Barney wants to find her. He starts looking for in the root of the tree and (since he is Barney Stinson not a random guy), he uses a random DFS to search in the cities. A pseudo code of this algorithm is as follows:
let starting_time be an array of length n
current_time = 0
dfs(v):
current_time = current_time + 1
starting_time[v] = current_time
shuffle children[v] randomly (each permutation with equal possibility)
// children[v] is vector of children cities of city v
for u in children[v]:
dfs(u)
As told before, Barney will start his journey in the root of the tree (equivalent to call dfs(1)).
Now Barney needs to pack a backpack and so he wants to know more about his upcoming journey: for every city i, Barney wants to know the expected value of starting_time[i]. He’s a friend of Jon Snow and knows nothing, that’s why he asked for your help.
Input
The first line of input contains a single integer n (1 ≤ n ≤ 105) — the number of cities in USC.
The second line contains n - 1 integers p2, p3, …, pn (1 ≤ pi < i), where pi is the number of the parent city of city number i in the tree, meaning there is a road between cities numbered pi and i in USC.
Output
In the first and only line of output print n numbers, where i-th number is the expected value of starting_time[i].
Your answer for each city will be considered correct if its absolute or relative error does not exceed 10 - 6.
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
【题解】
题意:在树上进行dfs,从1节点开始dfs获取时间戳,每次dfs的时候搜的是任意一个儿子节点(每个节点搜到概率相同),求每个儿子的时间戳的期望;
首先1号节点的时间戳肯定是1.
ans[1] = 1;
然后我们考虑上图中1号节点的一个儿子节点3;
则有以下6种搜索的顺序
(它的子树就不写出来了)
1 2 3 4 ···①
1 2 4 3 ···②
1 3 2 4 ···③
1 3 4 2 ···④
1 4 2 3 ···⑤
1 4 3 2 ···⑥
(以下size[x]表示以x为根节点的子树的节点个数)
先让ans[3] = ans[1];
然后
③和④都是直接一步到达三号节点的,则增加量为2;
①则增加了size[2]+1,
②则增加了size[2]+size[4]+1;
⑤增加了size[4]+size[2]+1;
⑥增加了size[4]+1;
所以ans[3]+= (2+1+1+1+1 + 3*size[2] + 3*size[4])/6;
(除6可以这样理解,每种增加量的概率都是1/6)
再多观察一下。可以发现A(3,3)的所有排列中,所有1的直系儿子节点中除了3号节点外,其他节点在3号节点前面的概率都是1/2;
设3号节点的兄弟节点为a1,a2;
则我们最后ans[3]+= x
则x必然是 t1*size[a1] + t2*size[a2]+6 的形式
6可以理解吧?->这个常熟肯定是等于A(3,3)的
那么t1和t2的系数是多少呢?
“除了3号节点外,其他节点在3号节点前面的概率都是1/2”
根据这句话可以知道,那些系数t1,t2肯定都是相同的且为A(3,3)/2;
这样除下去就是1/2了。
所以归纳一下
ans[x] = ans[x的父亲节点] + (∑size[兄弟节点])/2 + 1
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int MAXN = 2e5;
int n, cnt[MAXN] = { 0 };
double ans[MAXN] = { 0 };
vector <int> a[MAXN];
void input(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
}
void dfs(int x)
{
cnt[x] = 1;
int len = a[x].size();
for (int i = 0; i <= len - 1; i++){
int y = a[x][i];
dfs(y);
cnt[x] += cnt[y];
}
}
void get_ans(int x)
{
int len = a[x].size();
for (int i = 0; i <= len - 1; i++){
int y = a[x][i];
ans[y] = ans[x] + 1.0 + ((cnt[x] - cnt[y] - 1)*1.0) / 2.0; //父亲节点的大小减去这y节点的大小再减去父亲节点本身,就是y的兄弟节点的大小了。
get_ans(y);
}
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input(n);
for (int i = 2; i <= n; i++){
int x;
input(x);
a[x].push_back(i);
}
dfs(1);
ans[1] = 1.0;
get_ans(1);
for (int i = 1; i <= n; i++)
printf("%.1lf%c", ans[i],i==n?'\n':' ');
return 0;
}
【64.52%】【codeforces 697D】Puzzles的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【52.49%】【codeforces 556A】Case of the Zeros and Ones
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【25.64%】【codeforces 570E】Pig and Palindromes
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【44.64%】【codeforces 743C】Vladik and fractions
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 514E】Darth Vader and Tree
[题目链接]:http://codeforces.com/problemset/problem/514/E [题意] 无限节点的树; 每个节点都有n个儿子节点; 且每个节点与其第i个节点的距离都是ai ...
- 【74.00%】【codeforces 747A】Display Size
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
随机推荐
- noi25 最长最短单词(为什么会出现运行时错误)
noi25 最长最短单词(为什么会出现运行时错误) 一.总结 一句话总结:比如除以零,数组越界,指针越界,使用已经释放的空间,数组开得太大,超出了栈的范围,造成栈溢出 1.c++报runtime er ...
- Fiddler抓包工具详细介绍
本文转自:http://www.cnblogs.com/Chilam007/p/6985379.html 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请 ...
- Maven学习总结(17)——深入理解maven灵活的构建
一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建.maven为了支持构建的灵活性,内置了三大特性,即:属性.profile和资源过滤. 1.maven属性 maven属性分6类 ...
- python opencv3 —— 常用工具、辅助函数、绘图函数(图像添加文本、矩形等几何形状)
1. cv2.hconcat().cv2.vconcat() 将从摄像头捕获的多个图像帧,横向(cv2.hconcat)或纵向(cv2.vconcat)拼接到一起,使得可以在一个 window 中进行 ...
- 【例题 6-2 UVA - 514】Rails
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 栈模拟一下就好. 每个输出段后面都有一个空行. 包括最后一个. [代码] #include <bits/stdc++.h> ...
- UVA 11728 - Alternate Task (数论)
Uva 11728 - Alternate Task 题目链接 题意:给定一个因子和.求出相应是哪个数字 思路:数字不可能大于因子和,对于每一个数字去算出因子和,然后记录下来就可以 代码: #incl ...
- LDD3之并发和竞态-completion(完毕量)的学习和验证
LDD3之并发和竞态-completion(完毕量)的学习和验证 首先说下測试环境: Linux2.6.32.2 Mini2440开发板 一開始难以理解书上的书面语言,这里<linux中同步样例 ...
- UCloud上LAMP小型站点搭建与測试
文件夹 介绍 LAMP环境搭建 打开UCloud防火墙 WordPress安装 应用測试 介绍 本篇博客旨在通过介绍搭建一个WordPress博客的过程介绍在UCloud的云主机(UHOST)上搭建单 ...
- spyder在虚拟机上运行内核一直崩溃
可能的原因是因为虚拟机设置的内存过小了
- [Angular] Creating an Observable Store with Rx
The API for the store is really simple: /* set(name: string, state: any); select<T>(name: stri ...