제출 #5867

#제출 시각아이디문제언어결과실행 시간메모리
5867cki86201Company Planning (TOKI14_company)C++98
100 / 100
116 ms8152 KiB
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

int m, n;
int p[100010], o[100010], q[100010], d[100010];
vector <int> v[100010];

int main()
{
	scanf("%d%d",&n,&m);
	int i;
	for(i=2;i<=n;i++){
		scanf("%d",p+i);
		++o[p[i]];
	}
	int *f = q, *r = q;
	for(i=1;i<=n;i++)if(!o[i])*f++ = i;
	for(i=1;i<=n;i++)d[i] = 1;
	while(f != r){
		int t = *r++;
		if(--o[p[t]] == 0)*f++ = p[t], d[p[t]] += d[t];
	}
	int L = 0, R = n, K = 0;
	while(L <= R){
		int M = (L+R) >> 1;
		for(i=0;i<n;i++){
			int u = q[i], cnt = 1;
			sort(v[u].begin(), v[u].end());
			reverse(v[u].begin(), v[u].end());
			for(int j=0;j<M && j<(int)v[u].size();j++)cnt += v[u][j];
			v[p[u]].push_back(cnt);
			if(i == n-1){
				if(cnt >= m)K = M, R = M-1;
				else L = M+1;
			}
		}
		for(i=1;i<=n;i++)v[i].clear();
	}
	printf("%d",K);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...