제출 #1282235

#제출 시각아이디문제언어결과실행 시간메모리
1282235Hamed_GhaffariCat in a tree (BOI17_catinatree)C++20
0 / 100
2 ms576 KiB
#include <bits/stdc++.h>
using namespace std;

const int MXN = 2e5+5, LOG = 17;

int n, d, sz[MXN];
vector<int> g[MXN];

bool dead[MXN];

int get_sz(int v, int p=-1) {
    sz[v] = 1;
    for(int u : g[v])
        if(!dead[u] && u!=p)
            sz[v] += get_sz(u, v);
    return sz[v];
}
int centroid(int v, int N, int p=-1) {
    for(int u : g[v])
        if(!dead[u] && u!=p && 2*sz[u]>N)
            return centroid(u, N, v);
    return v;
}
int h[MXN], par[MXN], dp[LOG][MXN], val[MXN];
void dfs(int id, int v, int p=-1) {
    for(int u : g[v])
        if(!dead[u] && u!=p)
            dp[id][u] = dp[id][v]+1,
            dfs(id, u, v);
}
void decompose(int v, int cur=0, int p=-1) {
    dead[v = centroid(v, get_sz(v))] = 1;
    h[v] = cur;
    par[v] = p;
    val[v] = 1e9;
    dp[h[v]][v] = 0;
    dfs(h[v], v);
    for(int u : g[v])
        if(!dead[u])
            decompose(u, cur+1, v);
}
void upd(int v) {
    for(int u=v; u!=-1; u=par[u])
        val[u] = min(val[u], dp[h[u]][v]);
}
int get(int v) {
    int res = 1e9;
    for(int u=v; u!=-1; u=par[u])
        res = min(res, dp[h[u]][v]+val[u]);
    return res;
}

vector<int> vec;
void DFS(int v, int p=-1) {
    for(int u : g[v])
        if(u!=p)
            DFS(u, v);
    vec.push_back(v);
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> d;
    for(int i=1; i<n; i++) {
        int p;
        cin >> p;
        g[p].push_back(i);
        g[i].push_back(p);
    }
    decompose(0);
    DFS(0);
    int ans = 0;
    for(int v : vec)
        if(get(v)>=d) {
            ans++;
            upd(v);
        }
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...