#include <bits/stdc++.h>
using namespace std;
int n, d;
vector<int> tree[200001];
int counts[200001];
int distances[200001];
void dfs(int node, int parent)
{
if (tree[node].size() == 1 && node != 0)
{
counts[node] = 1;
distances[node] = 1;
return;
}
vector<int> children;
int sum = 0;
for (int child : tree[node])
{
if (child == parent) continue;
dfs(child, node);
children.push_back(distances[child]);
sum += counts[child];
}
sort(children.begin(), children.end());
int last = 0;
for (int i = 0; i < children.size() - 1; ++i)
{
if (children[i] + children[i + 1] < d)
{
--sum;
last = i + 1;
}
}
bool any = false;
for (int v : children)
{
if (v < d)
{
any = true;
break;
}
}
if (!any)
{
counts[node] = sum + 1;
distances[node] = 1;
return;
}
counts[node] = sum;
distances[node] = children[last] + 1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> d;
for (int i = 1; i < n; ++i)
{
int p;
cin >> p;
tree[p].push_back(i);
tree[i].push_back(p);
}
if (n == 1)
{
cout << "1\n";
return 0;
}
dfs(0, -1);
cout << counts[0] << '\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... |