题解 【[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;
}