Submission #254132

#TimeUsernameProblemLanguageResultExecution timeMemory
254132rama_pangTax Evasion (LMIO19_mokesciai)C++14
100 / 100
303 ms70136 KiB
#include <bits/stdc++.h> using namespace std; using lint = long long; const int MAXN = 200005; const int INF = 1e8; int N, M; int A[MAXN]; vector<int> adj[MAXN]; int depth[MAXN]; int lift[MAXN][20]; void DfsInit(int u) { for (int j = 1; j < 20; j++) { lift[u][j] = lift[lift[u][j - 1]][j - 1]; } for (auto v : adj[u]) { lift[v][0] = u; depth[v] = depth[u] + 1; DfsInit(v); } } int dp[MAXN]; multiset<int> leaf[MAXN]; void Dfs(int u) { dp[u] = INF; leaf[u].emplace(depth[u]); for (auto v : adj[u]) { Dfs(v); if (leaf[u].size() < leaf[v].size()) swap(leaf[u], leaf[v]); for (auto i : leaf[v]) leaf[u].emplace(i); leaf[v].clear(); dp[u] = min(dp[u], dp[v]); } while (A[u] > 0) { A[u]--; auto it = prev(end(leaf[u])); dp[u] = min(dp[u], *it); leaf[u].erase(it); } } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> N >> M; for (int i = 2; i <= N; i++) { int p; cin >> p; adj[p].emplace_back(i); } for (int i = 0; i < M; i++) { int x; cin >> x; A[x]++; } if (A[1]) { cout << 1 << "\n"; return 0; } DfsInit(1); for (int i = 1; i <= N; i++) { if (A[i]) { int u = i; for (int j = 19; j >= 0; j--) { if (lift[u][j] != 0 && depth[lift[u][j]] > depth[i] - depth[lift[u][j]]) { u = lift[u][j]; } } A[u]++; A[i]--; } } Dfs(1); cout << 1 + dp[1] << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...