Submission #1255387

#TimeUsernameProblemLanguageResultExecution timeMemory
1255387thdh__Designated Cities (JOI19_designated_cities)C++20
100 / 100
235 ms59152 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second #define all(a) a.begin(),a.end() #define bruh ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define int ll using namespace std; typedef pair<int,int> pii; const int N = 2e5+5; const int inf = (int)1e18; int n,q; vector<pair<int, pii>> adj[N]; vector<int> delta[N]; int best[N]; long long ans[N]; long long sum_global; long long mn_global, add_global; int root; long long dfs(int u, int p, long long cur) { long long mx1 = -inf, mx2 = -inf; for (auto &e : adj[u]) { int v = e.fi, a = e.se.fi, b = e.se.se; if (v == p) continue; sum_global += a; long long tmp = dfs(v, u, cur + b - a) + a; if (mx1 < tmp) { mx2 = mx1; mx1 = tmp; } else if (mx2 < tmp) mx2 = tmp; } add_global = min(add_global, cur); if (mn_global > cur - mx1 - mx2 && adj[u].size() != 1) { mn_global = cur - mx1 - mx2; root = u; } return max(mx1, 0ll); } void dfs1(int u, int p) { int heavy = -1; int id1 = -1, id2 = -1; long long mx1 = -inf, mx2 = -inf; int mxsz = 0; for (auto &e : adj[u]) { int v = e.fi, a = e.se.fi, b = e.se.se; if (v == p) continue; sum_global += a; dfs1(v, u); best[v] += a; if ((int)delta[v].size() > mxsz) { mxsz = (int)delta[v].size(); heavy = v; } if (best[v] > mx1) { mx2 = mx1; id2 = id1; mx1 = best[v]; id1 = v; } else if (best[v] > mx2) { mx2 = best[v]; id2 = v; } } if (heavy != -1) delta[u].swap(delta[heavy]); for (auto &e : adj[u]) { int v = e.fi, a = e.se.fi, b = e.se.se; if (v == p) continue; if (v != heavy) { for (int val : delta[v]) delta[u].pb(val); } if (v != id1 && (p != 0 || v != id2)) delta[u].pb(best[v]); } if (mx1 == -inf) best[u] = 0; else best[u] = (int)mx1; if (p == 0 && mx2 != -inf) best[u] = (int)(mx1 + mx2); } void solve() { cin >> n; for (int i = 1; i <= n; ++i) { adj[i].clear(); delta[i].clear(); best[i] = 0; ans[i] = 0; } sum_global = 0; mn_global = inf; add_global = inf; root = 1; for (int i = 1; i < n; ++i) { int u,v,a,b; cin >> u >> v >> a >> b; adj[u].pb({v,{a,b}}); adj[v].pb({u,{b,a}}); } for (int i = 1; i <= n; ++i) if (adj[i].size() > 1) { root = i; break; } dfs(root, 0, 0); ans[0] = sum_global + add_global; sum_global = 0; dfs1(root, 0); ans[1] = sum_global - best[root]; sort(all(delta[root])); int sz = (int)delta[root].size(); for (int k = 2; k <= n-1; ++k) { if (!delta[root].empty()) { ans[k] = ans[k-1] - (long long)delta[root].back(); delta[root].pop_back(); } else ans[k] = ans[k-1]; } cin >> q; while (q--) { int x; cin >> x; cout << ans[x-1] << "\n"; } } signed main() { bruh solve(); 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...