Submission #1280507

#TimeUsernameProblemLanguageResultExecution timeMemory
1280507hubertmCat in a tree (BOI17_catinatree)C++20
100 / 100
84 ms25396 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...