Submission #1270421

#TimeUsernameProblemLanguageResultExecution timeMemory
1270421Davdav1232Cat in a tree (BOI17_catinatree)C++20
0 / 100
1 ms320 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

vvi G;
vi par, dep, blocked;
int ans = 0, d;

void dfs(int node, int p){
    dep[node] = (p == -1 ? 0 : dep[p] + 1);
    for(int nei : G[node]){
        if(nei == p) continue;
        dfs(nei, node);
    }
}

void mark(int node){
    if(blocked[node] != -1) return; // already covered
    ans++;
    queue<pii> q;
    q.push({node, d});
    while(!q.empty()){
        auto [u, dist] = q.front();
        q.pop();
        if(dist < 0) continue;
        if(blocked[u] >= dist) continue;
        blocked[u] = dist;
        for(int nei : G[u]){
            q.push({nei, dist-1});
        }
    }
}

int main() {
    int n;
    cin >> n >> d;
    par.resize(n);
    G.assign(n, {});
    for(int i=1; i<n; i++){
        cin >> par[i];
        G[i].push_back(par[i]);
        G[par[i]].push_back(i);
    }
    dep.resize(n);
    dfs(0, -1);

    blocked.assign(n, -1);

    vector<pair<int,int>> depths;
    for(int i=0; i<n; i++){
        depths.push_back({-dep[i], i});
    }
    sort(depths.begin(), depths.end());

    for(auto [negd, node] : depths){
        mark(node);
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...