제출 #1280332

#제출 시각아이디문제언어결과실행 시간메모리
1280332behradCat in a tree (BOI17_catinatree)C++17
100 / 100
355 ms67168 KiB
#include <bits/stdc++.h> using namespace std; // * No One Dies a Virgin, Life Fucks Us All typedef long long ll; #define nl '\n' #define ff first #define ss second #define pb push_back #define sik(x) {cout << x << nl; return;} constexpr ll maxn = 2e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20; typedef pair<int, int> pii; int n, D, sz[maxn], rem[maxn], h[maxn], near[maxn], ord[maxn]; vector<int> g[maxn]; vector<pii> par[maxn]; void PreDfs(int v, int p = 0) { for (int u : g[v]) { if (u != p) { h[u] = h[v] + 1; PreDfs(u, v); } } } void dfsSz(int v, int p = 0) { sz[v] = 1; for (int u : g[v]) { if (u != p && !rem[u]) { dfsSz(u, v); sz[v] += sz[u]; } } } int dfsC(int v, int p, int Sz) { for (int u : g[v]) { if (u != p && !rem[u] && 2 * sz[u] > Sz) return dfsC(u, v, Sz); } return v; } void dfsFill(int v, int p, int root, int len) { par[v].pb({root, len}); for (int u : g[v]) { if (u != p && !rem[u]) dfsFill(u, v, root, len + 1); } } void dcmp(int v) { dfsSz(v); v = dfsC(v, v, sz[v]); rem[v] = 1; dfsFill(v, v, v, 0); for (int u : g[v]) { if (!rem[u]) dcmp(u); } } inline bool chk(int v) { for (auto [u, len] : par[v]) { if (len + near[u] < D) return 0; } return 1; } inline void update(int v) { for (auto [u, len] : par[v]) { near[u] = min(near[u], len); } } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> D; for (int i = 2, p ; i <= n ; i ++) { cin >> p; ++ p; g[p].pb(i); g[i].pb(p); } PreDfs(1); dcmp(1); for (int i = 1 ; i <= n ; i ++) { near[i] = 2e5 + 10; ord[i] = i; } sort(ord + 1, ord + n + 1, [&] (int u, int v) { return h[u] > h[v]; }); int ans = 0; for (int j = 1 ; j <= n ; j ++) { int v = ord[j]; if (chk(v)) { update(v); ++ ans; } } cout << ans << nl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...