# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1165988 | ezzzay | Cat in a tree (BOI17_catinatree) | C11 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pb push_back
const int N=3e5+5;
int a[N];
vector<int>v[N];
int d;
deque<int>dp[N];
void dfs(int a){
dp[a].push_front(1);
int sz=0;
int x=0;
for(auto b:v[a]){
dfs(b);
dp[b].push_front(dp[b][0]);
if(dp[b].size()>dp[a].size())swap(dp[a],dp[b]);
for(int i=0;i<dp[b].size();i++){
int p=max(i, d-i);
if(dp[b].size()>p){
dp[a][i]=max({dp[a][i],dp[a][i]+dp[b][p]});
}
if(dp[a].size()>p){
dp[a][i]=max({dp[a][i],dp[a][p]+dp[b][i]});
}
}
}
}
signed main(){
int n;
cin>>n>>d;
for(int i=2;i<=n;i++){
cin>>a[i];
v[++a[i]].pb(i);
}
dfs(1);
int ans=0;
cout<<dp[1][1];
}