Submission #388725

#TimeUsernameProblemLanguageResultExecution timeMemory
3887251binDesignated Cities (JOI19_designated_cities)C++14
100 / 100
1222 ms40064 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll NMAX = 2e5 + 5; #define all(v) v.begin(), v.end() ll N, Q, a, b, c, d, W[NMAX], vis[NMAX], dp[NMAX], U[NMAX], D[NMAX], ans[NMAX]; vector<pair<ll, ll>> to[NMAX], v; void dfs2(int now, int bef) { for (auto& e : to[now]) { int nxt = e.first; if (nxt == bef) { U[now] += e.second; continue; } dfs2(nxt, now); D[now] += D[nxt] + e.second; } return; } void dfs3(int now, int bef) { for (auto& e : to[now]) { int nxt = e.first; if (nxt == bef) continue; U[nxt] += U[now] + D[now] - D[nxt] - e.second; dfs3(nxt, now); } return; } void init() { dfs2(1, -1); dfs3(1, -1); for (int i = 1; i <= N; i++) dp[i] = U[i] + D[i]; return; } int dfs(int now, int bef) { W[now] = 1; for (auto& e : to[now]) { int nxt = e.first; if (nxt == bef || vis[nxt]) continue; W[now] += dfs(nxt, now); } return W[now]; } int centroid(int now, int bef, int lim) { for (auto& e : to[now]) { int nxt = e.first; if (nxt == bef || vis[nxt]) continue; if (W[nxt] > lim) return centroid(nxt, now, lim); } return now; } ll go(int now, int bef, int r) { ll mx = -1, tmp; for (auto& e : to[now]) { int nxt = e.first; if (nxt == bef || vis[nxt]) continue; tmp = go(nxt, now, r) + e.second; if (mx == -1) mx = tmp; else { if (mx < tmp) swap(mx, tmp); if (tmp) v.emplace_back(tmp, r); } } return max(mx, 0LL); } void sol(int r) { int lim = dfs(r, -1) / 2; int ct = centroid(r, -1, lim); vis[ct] = 1; v.clear(); for (auto& e : to[ct]) { int nxt = e.first; if (vis[nxt]) continue; v.emplace_back(go(nxt, ct, nxt) + e.second, nxt); } sort(all(v)); reverse(all(v)); ll x = dp[ct]; ans[1] = min(ans[1], x); for (int i = 1; i <= v.size(); i++) { x -= v[i - 1].first; ans[i + 1] = min(ans[i + 1], x); } x = dp[ct]; int h = v.size(); for (int i = 0; i < v.size(); i++) { if (v[i].second != v[0].second) { h = i; break; } } if (h != v.size()) { x -= v[h].first; for (int i = 1; i <= h; i++) { if (i > 1) ans[i] = min(ans[i], x); x -= v[i - 1].first; } for (int i = h + 1; i <= v.size(); i++) { ans[i] = min(ans[i], x); if (i < v.size()) x -= v[i].first; } } /*ll a = b = 0, idx, cnt; for (int i = 0; i < v.size(); i++) { idx = v[i].second; if (!a) { a = idx; x -= v[i].first; } else if (a != idx) { b = idx; x -= v[i].first; break; } } if (b) { ans[2] = min(ans[2], x); cnt = 2; for (int i = 0; i < v.size(); i++) { idx = v[i].second; if (idx == a || idx == b) continue; cnt++; x -= v[i].first; ans[cnt] = min(ans[cnt], x); } }*/ for (auto& e : to[ct]) { int nxt = e.first; if (vis[nxt]) continue; sol(nxt); } return; } int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("input.txt", "r", stdin); cin >> N; for (int i = 0; i < N - 1; i++) { cin >> a >> b >> c >> d; to[a].emplace_back(b, c); to[b].emplace_back(a, d); } init(); /*for (int i = 1; i <= N; i++) cout << dp[i] << ' '; return 0;*/ fill(ans, ans + NMAX, 1e18); sol(1); for (int i = 2; i <= N; i++) ans[i] = min(ans[i], ans[i - 1]); cin >> Q; int k; while (Q--) { cin >> k; cout << ans[k] << '\n'; } return 0; }

Compilation message (stderr)

designated_cities.cpp: In function 'void sol(int)':
designated_cities.cpp:91:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |  for (int i = 1; i <= v.size(); i++) {
      |                  ~~^~~~~~~~~~~
designated_cities.cpp:99:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |  for (int i = 0; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
designated_cities.cpp:105:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |  if (h != v.size()) {
      |      ~~^~~~~~~~~~~
designated_cities.cpp:111:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   for (int i = h + 1; i <= v.size(); i++) {
      |                       ~~^~~~~~~~~~~
designated_cities.cpp:113:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |    if (i < v.size()) x -= v[i].first;
      |        ~~^~~~~~~~~~
#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...