Submission #1155857

#TimeUsernameProblemLanguageResultExecution timeMemory
1155857LudisseyCat in a tree (BOI17_catinatree)C++20
0 / 100
0 ms320 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...