제출 #1098811

#제출 시각아이디문제언어결과실행 시간메모리
1098811amunduzbaevCat in a tree (BOI17_catinatree)C++17
51 / 100
1037 ms14180 KiB
#include "bits/stdc++.h"

using namespace std;

#define ar array
typedef long long ll;
//~ #define int ll

template<class T> bool umin(T& a, const T b) { if(b < a) { a = b; return true; } return false; }
template<class T> bool umax(T& a, const T b) { if(a < b) { a = b; return true; } return false; }

void solve(){
	int n, D; cin >> n >> D;
	
	vector<vector<int>> edges(n + 1);
	
	for(int i=2;i<=n;i++){
		int a; cin >> a;  a++;
		
		edges[a].push_back(i);
		edges[i].push_back(a);
	}
	
	vector<int> d(n + 1);
	function<void(int, int)> dfs = [&](int u, int p){
		for(auto x : edges[u]){
			if(x == p) continue;
			d[x] = d[u] + 1;
			dfs(x, u);
		}
	};
	
	dfs(1, 1);
	int a = 1;
	for(int i=1;i<=n;i++){
		if(d[i] > d[a]) a = i;
	}
	
	d[a] = 0;
	dfs(a, a);
	
	vector<int> p(n);
	iota(p.begin(), p.end(), 1);
	sort(p.begin(), p.end(), [&](int i, int j){
		return d[i] > d[j];
	});
	
	vector<int> vis(n + 1);
	int res = 0;
	
	for(auto x : p){
		function<void(int, int, int)> dfs = [&](int u, int p, int d_){
			if(d_ >= D) return;
			vis[u] = 1;
			for(auto x : edges[u]){
				if(x == p) continue;
				dfs(x, u, d_ + 1);
			}
		};
		
		if(!vis[x]){
			res++;
			dfs(x, x, 0);
		}
	}
	
	cout<<res<<"\n";
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int t = 1;
	
	//~ cin >> t;
	
	while(t--){
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...