#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;
int n,d;
vector<vector<int>> neigh;
vector<int> cindex;
vector<int> memo;
vector<int> dist;
vector<int> childC;
int mxC=0;
int build_tree(int x, int p){
childC[x]=1;
for (int t=0; t<sz(neigh[x]); t++)
{
int u=neigh[x][t];
if(u==p||cindex[u]>=0) continue;
childC[x]+=build_tree(u,x);
}
return childC[x];
}
int centroid(int x, int p, int _n){
for (int t=0; t<sz(neigh[x]); t++)
{
int u=neigh[x][t];
if(u==p||cindex[u]>=0) continue;
if(childC[u]*2>=_n) return centroid(u,x,_n);
}
return x;
}
void decompo(int x, int compoINDEX){
build_tree(x,-1);
if(childC[x]==1) { cindex[x]=compoINDEX; mxC=max(compoINDEX,mxC); return;}
int c=centroid(x,-1,childC[x]);
cindex[c]=compoINDEX;
mxC=max(compoINDEX,mxC);
for (auto u : neigh[c])
{
if(cindex[u]>=0) continue;
decompo(u,compoINDEX+1);
}
}
int calc(int x, int p, int dst, int indx){
dist[min(d,dst)]=max(dist[min(d,dst)],memo[x]);
int mx=dst;
for (auto u : neigh[x])
{
if(u==p||cindex[u]<=indx) continue;
mx=max(mx,calc(u,x,dst+1,indx));
}
return mx;
}
int dp(int x){
if(memo[x]!=-1) return memo[x];
vector<vector<int>> clc(sz(neigh[x]));
int mxS=0;
for (int t=0; t<sz(neigh[x]); t++)
{
int u=neigh[x][t];
if(cindex[u]<=cindex[x]) continue;
dist[0]=0;
mxS=max(calc(u,x,1,cindex[x]),mxS);
clc[t].resize(1);
clc[t][0]=0;
for (int i = 1; i <= d; i++)
{
if(dist[i]==-1) break;
clc[t].push_back(dist[i]);
dist[i]=-1;
}
}
mxS++;
vector<int> mxdist(mxS,0);
mxdist[0]=0;
for (int t=0; t<sz(neigh[x]); t++)
{
int u=neigh[x][t];
if(cindex[u]<=cindex[x]) continue;
for (int i = 0; i < sz(clc[t]); i++)
{
if(mxdist[i]<0) mxdist[i]=0;
mxdist[i]+=clc[t][i];
}
}
memo[x]=1;
for (int t=0; t<sz(neigh[x]); t++)
{
int u=neigh[x][t];
if(cindex[u]<=cindex[x]) continue;
for (int i = 1; i < sz(clc[t]); i++)
{
if(d-i>=sz(mxdist)) continue;
int v=mxdist[d-i];
if(d-i<sz(clc[t])) v-=clc[t][d-i];
memo[x]=max(memo[x],v+clc[t][i]);
}
}
if(sz(mxdist)>d) memo[x]=max(1+mxdist[d],memo[x]);
return memo[x];
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
cin >> n >> d;
cindex.resize(n,-1); childC.resize(n); dist.resize(d+1,-1); neigh.resize(n); memo.resize(n,-1);
for (int i = 1; i < n; i++)
{
int x; cin >> x;
neigh[x].push_back(i);
neigh[i].push_back(x);
}
decompo(0,0);
mxC++;
vector<vector<int>> grp(mxC);
for (int i = 0; i < n; i++)
{
grp[cindex[i]].push_back(i);
}
int ans=0;
for (int c = mxC-1; c >= 0; c--) {
for (auto u : grp[c])
{
ans=max(ans,dp(u));
}
}
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |