제출 #1286033

#제출 시각아이디문제언어결과실행 시간메모리
1286033domiCat in a tree (BOI17_catinatree)C++20
100 / 100
40 ms21048 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 2e5;

using namespace std;

vector<int>T[NMAX + 5];
int dp[NMAX + 5], closestDistance[NMAX + 5], n, d;

void dfs(int nod) {
    if (sz(T[nod]) == 0) {
        dp[nod] = 1;
        closestDistance[nod] = 1;
        return;
    }

    vector<pii>distances;
    for (auto &son : T[nod]) {
        dfs(son);
        distances.push_back({closestDistance[son], son});
        dp[nod] += dp[son];
    }

    sort(all(distances));
    int firstChild = 0, c = distances[0].se;
    for (int i = 0; i + 1 < sz(distances); ++i) {
        if (distances[i].fi + distances[i + 1].fi < d) {
            --dp[nod];
            firstChild = i + 1;
            c = distances[i + 1].se;
        }
    }

    if (distances[firstChild].fi >= d) {
        ++dp[nod];
        closestDistance[nod] = 1;
    }
    else
        closestDistance[nod] = closestDistance[c] + 1;
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> d;

    for (int i = 1, u; i < n; ++i) {
        cin >> u;
        T[u].push_back(i);
    }

    dfs(0);
    cout << dp[0] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...