Submission #322561

#TimeUsernameProblemLanguageResultExecution timeMemory
322561thecodingwizardUntitled (POI11_dyn)C++11
100 / 100
1860 ms36204 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define ii pair<int, int> #define f first #define s second #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define F0R(i, n) for (int i = 0; i < n; i++) #define FOR(i, a, b) for (int i = a; i < b; i++) #define inf 1000000010 #define maxn 300000 int n, m; vector<int> adj[maxn]; bool lit[maxn]; int need[maxn]; // # of dynamites needed int farthestDyn[maxn]; // farthest dynamite in subtree of i int extraExplosion[maxn]; // extra explosion coming out of subtree of i void dfs(int u, int p, int t) { for (int v : adj[u]) { if (v != p) { dfs(v, u, t); } } int extra = 0; for (int v : adj[u]) { if (v == p) continue; extra = max(extra, extraExplosion[v]); } --extra; int farDyn = lit[u] ? 0 : -inf; for (int v : adj[u]) { if (v == p) continue; farDyn = max(farDyn, farthestDyn[v] + 1); } if (farDyn <= extra) { farDyn = -inf; } assert(farDyn <= t); int totNeed = 0; for (int v : adj[u]) { if (v == p) continue; totNeed += need[v]; } if (farDyn == t) { farDyn = -inf; extra = t; totNeed++; } need[u] = totNeed; farthestDyn[u] = farDyn; extraExplosion[u] = extra; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> m; F0R(i, n) cin >> lit[i]; F0R(i, n-1) { int a, b; cin >> a >> b; --a; --b; adj[a].pb(b); adj[b].pb(a); } int lo = 0, hi = n, mid, ans = -1; while (lo < hi) { mid = (lo+hi)/2; dfs(0, 0, mid); if (farthestDyn[0] >= 0) need[0]++; if (need[0] <= m) { hi = mid; ans = mid; } else { lo = mid+1; } } cout << ans << endl; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...