Submission #1233816

#TimeUsernameProblemLanguageResultExecution timeMemory
1233816Bui_Quoc_CuongDesignated Cities (JOI19_designated_cities)C++20
7 / 100
143 ms45684 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; int n; struct Edges{ int v, w1, w2; }; vector <Edges> g[maxn]; long long dp[maxn]; array <long long, 2> dp1[maxn]; array <long long, 3> dp2[maxn]; long long ans[maxn]; long long tot = 0; void dfs(int u, int p){ for(auto e : g[u]){ int v = e.v, w2 = e.w2; if(v == p) continue; dfs(v, u); dp[u]+= dp[v] + w2; } dp1[u] = {dp[u], u}; dp2[u] = {0, u, u}; for(auto e : g[u]){ int v = e.v, w1 = e.w1, w2 = e.w2; if(v == p) continue; dp2[u] = max(dp2[u], {dp1[v][0] + w1 + dp[u] - dp[v], u, dp1[v][1]}); dp2[u] = max(dp2[u], {dp1[u][0] + w1 - dp[v] + dp1[v][0], dp1[u][1], dp1[v][1]}); dp2[u] = max(dp2[u], {dp2[v][0] + w1 + dp[u] - dp[v] - w2, dp2[v][1], dp2[v][2]}); dp1[u] = max(dp1[v], {dp1[v][0] + w1 + dp[u] - dp[v], dp1[v][1]}); } } void dfs_reroot(int u, int p, long long cur){ ans[1] = min(ans[1], tot - cur); for(auto e : g[u]){ int v = e.v, w1 = e.w1, w2 = e.w2; if(v == p) continue; dfs_reroot(v, u, cur - w2 + w1); } } priority_queue <long long, vector <long long>> pq; long long dfs_for_all(int u, int p){ if(u == dp2[1][2]) return 1e18; vector <long long> zip; for(auto e : g[u]){ int v = e.v, w1 = e.w1; if(v == p) continue; zip.push_back(dfs_for_all(v, u) + w1); } int pos = max_element(zip.begin(), zip.end()) - zip.begin(); for(int i = 0; i < (int)zip.size(); i++){ if(i == pos) pq.push(0); else pq.push(zip[i]); } if(zip.empty()) return 0; return zip[pos]; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for(int i = 1; i < n; i++){ int u, v, w1, w2; cin >> u >> v >> w1 >> w2; g[u].push_back({v, w1, w2}); g[v].push_back({u, w2, w1}); tot+= w1 + w2; } memset(ans, 0x3f, sizeof ans); dfs(1, 1); ans[2] = tot - dp2[1][0]; dfs_reroot(1, 1, dp[1]); dfs_for_all(1, 1); for(int i = 3; i <= n; i++){ ans[i] = ans[i - 1] - pq.top(); pq.pop(); } int q; cin >> q; while(q--){ int t; cin >> t; cout << ans[t] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...