Submission #1296195

#TimeUsernameProblemLanguageResultExecution timeMemory
1296195avighnaCat in a tree (BOI17_catinatree)C++20
51 / 100
1096 ms11732 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, d; cin >> n >> d; vector<vector<int>> adj(n); for (int i = 1, p; i < n; ++i) { cin >> p; adj[p].push_back(i); } if (d >= n) { cout << "1\n"; return 0; } vector<int> sz(n); auto dfs_sz = [&](auto &&self, int u) -> void { sz[u] = 1; for (int &i : adj[u]) { self(self, i); sz[u] += sz[i]; } }; dfs_sz(dfs_sz, 0); auto dfs = [&](auto &&self, int u) -> deque<int> { deque<int> dp(sz[u]); for (int &i : adj[u]) { vector<int> suff_dp(dp.size()); suff_dp.back() = dp.back(); for (int i = dp.size() - 2; i >= 0; --i) { suff_dp[i] = max(dp[i], suff_dp[i + 1]); } deque<int> ndp = self(self, i); ndp.push_front(0); vector<int> suff_ndp(ndp.size()); suff_ndp.back() = ndp.back(); for (int i = ndp.size() - 2; i >= 0; --i) { suff_ndp[i] = max(ndp[i], suff_ndp[i + 1]); } deque<int> nndp = dp; for (int i = 0; i < ndp.size(); ++i) { nndp[i] = max(nndp[i], ndp[i]); } for (int i = 0; i < ndp.size(); ++i) { if (max(i + 1, d - i) < dp.size()) { nndp[i] = max(nndp[i], suff_dp[max(i + 1, d - i)] + ndp[i]); } } for (int i = 0; i < dp.size(); ++i) { if (max(i, d - i) < ndp.size()) { nndp[i] = max(nndp[i], dp[i] + suff_ndp[max(i, d - i)]); } } dp = nndp; } dp[0] = max(dp[0], (d < sz[u] ? dp[d] : 0) + 1); return dp; }; deque<int> dp = dfs(dfs, 0); cout << *max_element(dp.begin(), dp.end()) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...