Submission #1243250

#TimeUsernameProblemLanguageResultExecution timeMemory
1243250minhpkCat in a tree (BOI17_catinatree)C++20
100 / 100
198 ms212876 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a, b;
vector<int> z[200005];
deque<int> dq[200005];

void dfs(int i, int par) {
    dq[i].push_front(1);
    for (auto p : z[i]) {
        if (p == par) continue;
        dfs(p, i);
        dq[p].push_front(dq[p].front());
        if (dq[p].size() > dq[i].size()) dq[i].swap(dq[p]);
        int up =  (int)dq[p].size() -1;
        for (int j = 0; j <= up; j++) {
            int x = dq[p][j];
            int t = max(j, b - j);
            if (t < (int)dq[i].size()) x += dq[i][t];

            int y = dq[i][j];
            if (t < (int)dq[p].size()) y += dq[p][t];

            dq[i][j] = max({dq[i][j], max(x, y)});
        }
        for (int j = dq[p].size() - 1; j >= 0; j--) {
            if (j + 1 < (int)dq[i].size()) dq[i][j] = max(dq[i][j], dq[i][j + 1]);
        }
        dq[p].clear();
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> b;
    for (int i = 2; i <= a; i++) {
        int x;
        cin >> x;
        x++;
        z[x].push_back(i);
    }
    if (b == 0) {
        cout << a << "\n";
        return 0;
    }
    if (b >= a) {
        cout << 1 << "\n";
        return 0;
    }
    dfs(1, 0);
    cout << dq[1][0] << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...