Submission #897706

#TimeUsernameProblemLanguageResultExecution timeMemory
897706AlcabelCat in a tree (BOI17_catinatree)C++17
100 / 100
161 ms40064 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5; vector<int> g[maxn]; int h[maxn]; set<pair<int, int>> ans[maxn]; void dfs(int v, int p, int d) { for (const int& u : g[v]) { if (u != p) { h[u] = h[v] + 1; dfs(u, v, d); if (!ans[v].empty() && !ans[u].empty() && ans[v].begin()->first + ans[u].begin()->first - 2 * h[v] < d) { // at least 1 to delete pair<int, int> mV = *ans[v].begin(), mU = *ans[u].begin(); ans[v].erase(ans[v].begin()); ans[u].erase(ans[u].begin()); tuple<int, int, int> oneH = {-1, -1, -1}; if (ans[v].empty() || ans[v].begin()->first + mU.first - 2 * h[v] >= d) { oneH = max(oneH, make_tuple(mU.first, (!ans[v].empty() ? ans[v].begin()->first : -1), u)); } if (ans[u].empty() || ans[u].begin()->first + mV.first - 2 * h[v] >= d) { oneH = max(oneH, make_tuple(mV.first, (!ans[u].empty() ? ans[u].begin()->first : -1), v)); } if (get<0>(oneH) != -1) { if (get<2>(oneH) == v) { ans[v].emplace(mV); } else { ans[u].emplace(mU); } } } if ((int)ans[v].size() < (int)ans[u].size()) { ans[v].swap(ans[u]); } while (!ans[u].empty()) { ans[v].emplace(*ans[u].begin()); ans[u].erase(ans[u].begin()); } } } if (ans[v].empty() || ans[v].begin()->first >= h[v] + d) { ans[v].emplace(h[v], v); } } void solve() { int n, d; cin >> n >> d; for (int i = 1; i < n; ++i) { int p; cin >> p; g[p].emplace_back(i); g[i].emplace_back(p); } dfs(0, -1, d); cout << ans[0].size() << '\n'; /*for (const pair<int, int>& v : ans[0]) { cout << v.second + 1 << ' '; } cout << '\n';*/ } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int T = 1; cin >> T; while (T--) { solve(); cerr << "-----------\n"; cout << "-----------\n"; } #else int T = 1; // cin >> T; while (T--) { solve(); } #endif return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...