#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define v vector
#define lp(i, s, e) for (int i = s; i < e; ++i)
v<v<int>> g;
int n, d;
v<int> sz, mark, best;
v<v<pair<int, int>>> dists;
const int inf = 1e7;
inline int f_sz(int node, int par) {
sz[node] = 1;
for (int it : g[node]) {
if (it != par && !mark[it]) {
sz[node] += f_sz(it, node);
}
}
return sz[node];
}
inline int find(int node, int par, int nodes) {
for (int it : g[node]) {
if (it != par && !mark[it]) {
if (sz[it] > nodes / 2)
return find(it, node, nodes);
}
}
return node;
}
inline void add(int node, int par, int cen, int dis) {
dists[node].push_back({cen, dis});
for (int it : g[node]) {
if (it != par && !mark[it]) {
add(it, node, cen, dis + 1);
}
}
}
inline void build(int node, int par) {
int nodes = f_sz(node, par);
int cen = find(node, par, nodes);
mark[cen] = 1;
add(cen, -1, cen, 0);
for (int it : g[cen]) {
if (it != par && !mark[it]) {
build(it, cen);
}
}
}
inline void update(int node) {
for (auto &[cen, dis] : dists[node]) {
best[cen] = min(best[cen], dis);
}
}
inline int query(int node) {
int ans = inf;
for (auto &[cen, dis] : dists[node]) {
ans = min(dis + best[cen], ans);
}
return ans;
}
v<pair<int, int>> dists2;
void dfs2(int node, int par, int dis) {
dists2.push_back({-dis, node});
for (auto it : g[node]) {
if (it != par) {
dfs2(it, node, dis + 1);
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> d;
g.resize(n);
sz.resize(n);
best.resize(n, inf);
dists.resize(n);
mark.resize(n);
lp(i, 1, n) {
int a, b = i;
cin >> a;
// a--;
g[a].push_back(b);
g[b].push_back(a);
}
build(0, -1);
dfs2(0, -1, 0);
int ans = 0;
v<int> nodes;
sort(dists2.begin(), dists2.end());
for (auto [dis, node] : dists2) {
int md = query(node);
if (md >= d) {
ans++;
update(node);
nodes.push_back(node);
}
}
cout << ans << '\n';
// for (auto it : nodes)
// cout << it + 1 << " ";
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |