Submission #1243250

#TimeUsernameProblemLanguageResultExecution timeMemory
1243250minhpkCat in a tree (BOI17_catinatree)C++20
100 / 100
198 ms212876 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int a, b; vector<int> z[200005]; deque<int> dq[200005]; void dfs(int i, int par) { dq[i].push_front(1); for (auto p : z[i]) { if (p == par) continue; dfs(p, i); dq[p].push_front(dq[p].front()); if (dq[p].size() > dq[i].size()) dq[i].swap(dq[p]); int up = (int)dq[p].size() -1; for (int j = 0; j <= up; j++) { int x = dq[p][j]; int t = max(j, b - j); if (t < (int)dq[i].size()) x += dq[i][t]; int y = dq[i][j]; if (t < (int)dq[p].size()) y += dq[p][t]; dq[i][j] = max({dq[i][j], max(x, y)}); } for (int j = dq[p].size() - 1; j >= 0; j--) { if (j + 1 < (int)dq[i].size()) dq[i][j] = max(dq[i][j], dq[i][j + 1]); } dq[p].clear(); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> a >> b; for (int i = 2; i <= a; i++) { int x; cin >> x; x++; z[x].push_back(i); } if (b == 0) { cout << a << "\n"; return 0; } if (b >= a) { cout << 1 << "\n"; return 0; } dfs(1, 0); cout << dq[1][0] << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...