【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& ...
随机推荐
- 【CodeForces】Gargari and Bishops
依据贪心能够知道,放置的教主必须不能相互攻击到(也就是不在一条对角线上)才干够使得结果最大化. 依据观察能够得到教主相互不攻击的条件是他的坐标和互为奇偶(x + y) 之后直接暴力,处理每一个坐标对角 ...
- 2016最热门的PHP框架(一共五款)
摘要: 兄弟连IT教育作为全国最大的PHP培训机构,迄今已有10年的教育历史.6大特色课程:PHP编程.安卓培训.JAVAEE+大数据.UI设计.HTML5培训.云计算架构师,在目前IT市场特别火,每 ...
- 中英文对照 —— 标点符号(punctuation)
有限的几个: What Are the Fourteen Punctuation Marks in English Grammar? period:句号:comma:逗号:冒号:colon:分号:se ...
- GO语言学习(九)Go 语言运算符
运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 下表 ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- 【ALearning】第四章 Android Layout组件布局(二)
前面我们分别介绍和学习了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoluteLayout(绝对布局).这次我们要进行RelativeLayout(相对布局)和Ta ...
- 恢复SLAVE上的某几张表的简要方法
同步报错是遇到最多的一个问题,如果你修复后发现还没有解决,通常的方法就是在Master上重新dump出一份,然后在slave上恢复.这个方法是针对整个库不是很大的情况下使用的,那如果是较大,全部dum ...
- MFC切换图片防止闪烁
处理WM_ERASEBKGND消息,在消息处理函数中return TRUE;
- Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析
原文地址: https://blog.csdn.net/yx0628/article/details/80873774 一个简单的Spring定时任务的 demo,全部代码见下载地址:https:// ...
- 积跬步,聚小流------java获取图片的尺寸
在一篇文章中获取到通过例如以下两种方式进行获取: 1.使用ImageReader进行获取: 2.使用BufferedImage进行获取: 而且经过验证ImageReader进行操作的耗时远远低于Buf ...