Submission #1359507

#TimeUsernameProblemLanguageResultExecution timeMemory
1359507edoRoad Closures (APIO21_roads)C++20
0 / 100
2095 ms23168 KiB
#include "roads.h"

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct Edge {
  int to, w;
};

ll solve(const vector<vector<Edge>> &g, int k) {
  int n = g.size();
  vector<ll> dp0(n), dp1(n);

  auto dfs = [&](auto &&self, int u, int p) -> void {
    ll base = 0;
    vector<ll> delta;

    for (auto [v, w] : g[u]) {
      if (v == p)
        continue;
      self(self, v, u);
      base += dp0[v];
      delta.push_back(dp1[v] + w - dp0[v]);
    }

    sort(delta.begin(), delta.end());

    auto get = [&](int can_keep) -> ll {
      int m = delta.size();
      int keep = max(0, can_keep);
      keep = min(keep, m);
      int need_close = m - keep;
      ll res = base;
      for (int i = 0; i < need_close; ++i)
        res += delta[i];
      return res;
    };

    dp1[u] = get(k);
    dp0[u] = get(k - 1);
  };

  dfs(dfs, 0, -1);
  return dp1[0];
}

vector<ll> minimum_closure_costs(int N, vector<int> U, vector<int> V,
                                 vector<int> W) {
  vector<vector<Edge>> g(N);
  for (int i = 0; i < N - 1; ++i) {
    g[U[i]].push_back({V[i], W[i]});
    g[V[i]].push_back({U[i], W[i]});
  }

  vector<ll> ans(N);
  for (int k = 0; k < N; ++k)
    ans[k] = solve(g, k);
  return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...