题解 【[ABC163C] management】

management

题目大意:有\(n\)个人,其中第\(1\)个人是\(Boss\)。接下来输入\(n-1\)个数,从\(a_2\)\(a_n\)。其中\(a_i\)\(i\)的直接上司,\(i\)就是\(a_i\)的直接下司。输出\(n\)行,第\(i\)行输出第\(i\)个人有几个直接下司。

这道题的人物关系其实可以当作一棵树。把直接上司当成父节点,直接下司当成子节点,而\(Boss\)则当成根节点。

首先来玩一下样例:

5
1 1 2 2

画出来应该是这样的:

因此,我们只要求每个节点有几个子节点即可。

接下来看看实现:

Code:

#include <bits/stdc++.h>
#define REP(i, a, b) for (long long i = a; i <= b; ++i)
#define ll long long
#define N 200010
using namespace std;

ll n, m, a[N];

inline ll read(){							//快读 
	ll s = 0, w = 1;
	char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar()) w *= ch == '-' ? -1 : 1;
	for (; ch >= '0' && ch <= '9'; ch = getchar()) s = s * 10 + ch - '0';
	return s * w;
}

inline void work(){
	n = read();								//输入n 
	REP(i, 2, n) m = read(), a[m]++;		//计算每个数的子节点个数 
	REP(i, 1, n) printf("%lld\n", a[i]);	//输出每个数的子节点个数 
}

int main(){
	work();
	return 0;
}
posted @ 2020-04-22 17:49  leoair  阅读(62)  评论(0编辑  收藏  举报