제출 #1336284

#제출 시각아이디문제언어결과실행 시간메모리
1336284LIA도로 폐쇄 (APIO21_roads)C++17
24 / 100
2096 ms21872 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define v vector
#define lp(i, s, e) for (ll i = s; i < e; ++i)
#define pll pair<ll, ll>

ll cur_k;
v<v<pll>> g;
v<ll> dp0, dp1;

void dfs(ll node, ll par) {
  ll base_cost = 0;
  v<ll> diffs;

  for (auto edge : g[node]) {
    ll nxt = edge.first;
    ll w = edge.second;
    if (nxt == par)
      continue;

    dfs(nxt, node);
    base_cost += dp0[nxt] + w;
    diffs.push_back(dp1[nxt] - dp0[nxt] - w);
  }

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

  dp0[node] = base_cost;
  dp1[node] = base_cost;

  lp(i, 0, min((ll)diffs.size(), cur_k)) {
    if (diffs[i] < 0)
      dp0[node] += diffs[i];
  }

  if (cur_k > 0) {
    lp(i, 0, min((ll)diffs.size(), cur_k - 1)) {
      if (diffs[i] < 0)
        dp1[node] += diffs[i];
    }
  } else {
    dp1[node] = 1e18;
  }
}

std::vector<long long> minimum_closure_costs(int n, std::vector<int> U,
                                             std::vector<int> V,
                                             std::vector<int> W) {

  g.resize(n);
  dp0.resize(n);
  dp1.resize(n);

  lp(i, 0, n - 1) {
    ll a = U[i], b = V[i], c = W[i];
    g[a].push_back({b, c});
    g[b].push_back({a, c});
  }
  v<ll> ans(n);

  lp(k, 0, n) {
    cur_k = k;
    dfs(0, -1);
    ans[k] = dp0[0];
  }

  return ans;
}

#ifndef EVAL
int main() {
  int N;
  assert(1 == scanf("%d", &N));

  std::vector<int> U(N - 1), V(N - 1), W(N - 1);
  for (int i = 0; i < N - 1; ++i) {
    assert(3 == scanf("%d %d %d", &U[i], &V[i], &W[i]));
  }

  std::vector<long long> closure_costs = minimum_closure_costs(N, U, V, W);
  for (int i = 0; i < static_cast<int>(closure_costs.size()); ++i) {
    if (i > 0) {
      printf(" ");
    }
    printf("%lld", closure_costs[i]);
  }
  printf("\n");
  return 0;
}
#endif
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...