Submission #254011

#TimeUsernameProblemLanguageResultExecution timeMemory
254011NightlightTax Evasion (LMIO19_mokesciai)C++14
100 / 100
583 ms42348 KiB
#include <bits/stdc++.h> using namespace std; int N, M; vector<int> adj[200005]; priority_queue<int, vector<int>> pq[200005]; int need[200005], can[200005], depth[200005]; bitset<200005> coin; void DFS(int u, int p) { depth[u] = depth[p] + 1; for(int v : adj[u]) { if(v == p) continue; DFS(v, u); if(pq[v].size() > pq[u].size()) swap(pq[u], pq[v]); need[u] += need[v]; } for(int v : adj[u]) { if(v == p) continue; while(!pq[v].empty()) pq[u].emplace(pq[v].top()), pq[v].pop(); } if(coin[u]) pq[u].emplace(depth[u] / 2 + (depth[u] & 1)); while(!pq[u].empty() && pq[u].top() == depth[u]) { need[u]++; pq[u].pop(); } // cout << u << " " << need[u] << "\n"; } int l, r, mid, ans; bool ok; void check(int u, int p) { if(depth[u] >= mid) can[u] = 1; else can[u] = 0; for(int v : adj[u]) { if(v == p) continue; check(v, u); can[u] += can[v]; } if(can[u] < need[u]) ok = 0; } int main() { depth[0] = -2; ios_base::sync_with_stdio(0); cin >> N >> M; int u; for(int i = 2; i <= N; i++) { cin >> u; adj[u].push_back(i); adj[i].push_back(u); } for(int i = 1; i <= M; i++) { cin >> u; coin[u] = 1; } if(coin[1] == 1) { cout << "1\n"; exit(0); } DFS(1, 0); l = -1, r = N - 2; while(l <= r) { mid = (l + r) >> 1; ok = 1; check(1, 0); if(ok) { ans = mid; l = mid + 1; }else r = mid - 1; } cout << ans + 2 << "\n"; cin >> N; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...