#include <bits/stdc++.h>
using namespace std;
class segment_tree {
private:
int n;
vector<int> seg;
public:
segment_tree(int n) : n(n), seg(2 * n, 0) {}
int query(int l, int r) {
int ans = 0;
for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
if (l & 1)
ans = max(ans, seg[l++]);
if (r & 1)
ans = max(ans, seg[--r]);
}
return ans;
}
void set(int i, int x) {
for (i += n, seg[i] = x, i >>= 1; i > 0; i >>= 1) {
seg[i] = max(seg[2 * i], seg[2 * i + 1]);
}
}
};
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) -> vector<int> {
vector<vector<int>> ch;
for (int &i : adj[u]) {
ch.push_back(self(self, i));
}
vector<int> dp(sz[u] + 1);
segment_tree st(sz[u]);
auto set = [&](int i, int x) { st.set(i, dp[i] = x); };
auto max_suff = [&](int i) { return st.query(i, sz[u] - 1); };
for (auto &ndp : ch) {
vector<int> qvals(ndp.size());
for (int i = 0; i < ndp.size(); ++i) {
if (max(i + 1, d - i) < dp.size() - 1) {
qvals[i] = max_suff(max(i + 1, d - i));
}
}
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]);
}
for (int i = 0; i < ndp.size() - 1; ++i) {
if (max(i, d - i) < ndp.size()) {
set(i, dp[i] + suff_ndp[max(i, d - i)]);
}
}
for (int i = 0; i < ndp.size(); ++i) {
set(i, max(dp[i], ndp[i]));
}
for (int i = 0; i < ndp.size(); ++i) {
if (max(i + 1, d - i) < dp.size() - 1) {
set(i, max(dp[i], qvals[i] + ndp[i]));
}
}
}
dp[0] = max(dp[0], (d < sz[u] ? dp[d] : 0) + 1);
for (int i = dp.size() - 1; i >= 1; --i) {
dp[i] = dp[i - 1];
}
dp[0] = 0;
return dp;
};
vector<int> dp = dfs(dfs, 0);
cout << *max_element(dp.begin(), dp.end()) << '\n';
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |