Submission #1305625

#TimeUsernameProblemLanguageResultExecution timeMemory
1305625ghos007Cat in a tree (BOI17_catinatree)C++20
0 / 100
67 ms134916 KiB
//#define _GLIBCXX_DEBUG #include <bits/stdc++.h> //#pragma GCC optimize("O3") #define int long long using namespace std; const int MAXN = 2e5 + 1; deque <int> dp[MAXN]; int h[MAXN],max_h[MAXN]; void dfs(int u,int p,vector <vector <int>> &g,int d) { dp[u] = {1}; for (auto el : g[u]) { if (el == p)continue; dfs(el,u,g,d); } if (max_h[u] == -1) { return; } swap(dp[u],dp[max_h[u]]); dp[u].push_front(1); while (dp[u].size() > d + 1) { dp[u].pop_back(); } for (auto el : g[u]) { if (el == p || el == max_h[u]) { continue; } for (int i = 0;i < dp[el].size();i++) { int di = i + 1; int v1 = max(di,d - di); int var1 = 0,var2 = 0; if (dp[u].size() > v1) { var1 = dp[el][di - 1] + dp[u][v1]; }else { var1 = dp[el][di-1]; } if (dp[el].size() > v1 - 1) { var2 = dp[el][v1-1] + dp[u][di]; }else { var2 = dp[u][di]; } dp[u][di] = max(var1,var2); } for (int i = dp[el].size();i >= 0 ;i--) { int di = i + 1; if (di + 1 < dp[u].size())dp[u][di] = max(dp[u][di],dp[u][di + 1]); } } } int dfs1(int u,int p,vector <vector <int>> &g) { max_h[u] = -1; for (auto el : g[u]) { if (el == p)continue; int h_now = dfs1(el,u,g); if (h_now > h[u]) { max_h[u] = el; h[u] = h_now; } } return h[u] + 1; } void solve() { int n,d; cin >> n >> d; vector <vector <int>> g(n); d = min(n,d); for (int i = 1;i < n;i++) { int x; cin >> x; g[x].push_back(i); } dfs1(0,-1,g); dfs(0,-1,g,d); int best = 0; for (auto el : dp[0]) { best = max(best,el); } cout << best << "\n"; } signed main() { ios::sync_with_stdio(0); cin.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...