Submission #630406

#TimeUsernameProblemLanguageResultExecution timeMemory
630406cadmiumskyDesignated Cities (JOI19_designated_cities)C++14
100 / 100
958 ms51216 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; #define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; const int nmax = 2e5 + 5, inf = 1e15 + 5; vector<tii> g[nmax]; int height[nmax], atrleaf[nmax], troot[nmax]; int wroot; void initdfs(int node, int f) { atrleaf[node] = node; for(auto [x, c, alt] : g[node]) { if(x == f) continue; troot[x] = troot[node] - c + alt; wroot += c; initdfs(x, node); tie(height[node], atrleaf[node]) = max(make_pair(height[x] + c, atrleaf[x]), make_pair(height[node], atrleaf[node])); } return; } int mxl, mxr, mxcost = inf; void diamdfs(int node, int f) { int ends[2] = {node, node}, cost[2] = {0, 0}; for(auto [x, c, alt] : g[node]) { if(x == f) continue; diamdfs(x, node); alt = height[x] + c; if(alt >= cost[0]) tie(ends[1], cost[1]) = pii{ends[0], cost[0]}, tie(ends[0], cost[0]) = pii{atrleaf[x], alt}; else if(alt > cost[1]) tie(ends[1], cost[1]) = pii{atrleaf[x], alt}; } if(wroot - (cost[0] + cost[1]) + troot[node] < mxcost) tie(mxl, mxr, mxcost) = tii{ends[0], ends[1], wroot - (cost[0] + cost[1]) + troot[node]}; } void reinitdfs(int node, int f) { atrleaf[node] = node; for(auto [x, c, alt] : g[node]) { if(x == f) continue; troot[x] = troot[node] + c; wroot += c; reinitdfs(x, node); if(troot[atrleaf[node]] < troot[atrleaf[x]]) atrleaf[node] = atrleaf[x]; } return; } priority_queue<int> pq; void initpqdfs(int node, int f, int offset = 0) { if(g[node].size() == 1 && node != f) { pq.push(troot[node] - offset); return; } for(auto [x, c, cost] : g[node]) { if(x == f) continue; if(atrleaf[node] != atrleaf[x]) initpqdfs(x, node, troot[node]); else initpqdfs(x, node, offset); } return; } int rez[nmax]; signed main() { int n; cin >> n; for(int i = 0, x, y, a, b; i < n - 1; i++) { cin >> x >> y >> a >> b; g[x].emplace_back(y, a, b); g[y].emplace_back(x, b, a); } int root = 1; initdfs(root, root); rez[1] = inf; for(int i = 1; i <= n; i++) rez[1] = min(rez[1], wroot + troot[i]); diamdfs(root, root); troot[root = mxl] = 0;; rez[2] = mxcost; wroot = 0; reinitdfs(root, root); initpqdfs(root, root); int ptr = 1; while(!pq.empty()) { wroot -= pq.top(); rez[++ptr] = wroot; pq.pop(); } ++ptr; while(ptr <= n) rez[ptr] = rez[ptr - 1], ptr++; int q; cin >> q; for(int i = 0, x; i < q; i++) { cin >> x; cout << rez[x] << '\n'; } } /** De-atâtea nopți aud plouând, Aud materia plângând.. Sînt singur, și mă duce un gând Spre locuințele lacustre. Și parcă dorm pe scânduri ude, În spate mă izbește-un val -- Tresar prin somn și mi se pare Că n-am tras podul de la mal. Un gol istoric se întinde, Pe-același vremuri mă găsesc.. Și simt cum de atâta ploaie Pilonii grei se prăbușesc. De-atâtea nopți aud plouând, Tot tresărind, tot așteptând.. Sînt singur, și mă duce-un gând Spre locuințele lacustre. -- George Bacovia, Lacustră */

Compilation message (stderr)

designated_cities.cpp: In function 'void initdfs(ll, ll)':
designated_cities.cpp:22:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   22 |   for(auto [x, c, alt] : g[node]) {
      |            ^
designated_cities.cpp: In function 'void diamdfs(ll, ll)':
designated_cities.cpp:35:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   35 |   for(auto [x, c, alt] : g[node]) {
      |            ^
designated_cities.cpp: In function 'void reinitdfs(ll, ll)':
designated_cities.cpp:51:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   51 |   for(auto [x, c, alt] : g[node]) {
      |            ^
designated_cities.cpp: In function 'void initpqdfs(ll, ll, ll)':
designated_cities.cpp:68:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   68 |   for(auto [x, c, cost] : g[node]) {
      |            ^
#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...