제출 #717244

#제출 시각아이디문제언어결과실행 시간메모리
717244schiftyfive4도로 폐쇄 (APIO21_roads)C++14
100 / 100
206 ms51772 KiB
#include <bits/stdc++.h>
#include "roads.h"
using namespace std;

#ifdef LOCAL
#include "debug.hpp"
#else
#define debug(...) "MJ >> LAMELO"
#endif

struct kset {
  int n = 1e9;
  multiset<long long, greater<long long>> s;
  long long sum = 0;
  vector<pair<int, long long>> ops;
  void clip(int k) {
    n = k;
    while ((int) s.size() > n) {
      sum -= *s.begin();
      s.erase(s.begin());
    }
  }
  void insert(long long x) {
    sum += x;
    s.insert(x);
    ops.emplace_back(1, x);
    if ((int) s.size() > n) {
      sum -= *s.begin();
      ops.emplace_back(0, *s.begin());
      s.erase(s.begin());
    }
  }
  void rollback() {
    while (!ops.empty()) {
      auto [t, x] = ops.back();
      ops.pop_back();
      if (t == 1) {
        sum -= x;
        assert(s.find(x) != s.end());
        s.erase(s.find(x));
      } else {
        sum += x;
        s.insert(x);
      }
    }
  }
};

std::vector<long long> minimum_closure_costs(int n, std::vector<int> U,
                                             std::vector<int> V,
                                             std::vector<int> W) {
  vector<int> deg(n);
  vector<long long> ans(n);
  vector<vector<pair<int, int>>> g(n);
  for (int i = 0; i < n - 1; i++) {
    ans[0] += W[i];
    deg[U[i]]++; deg[V[i]]++;
    g[U[i]].emplace_back(V[i], W[i]);
    g[V[i]].emplace_back(U[i], W[i]);
  }
  for (int i = 0; i < n; i++) {
    sort(g[i].begin(), g[i].end(), [&](auto u, auto v) {
      return deg[u.first] > deg[v.first];
    });
  }
  vector<int> par(n, -1);
  vector<int> up(n, -1);
  function<void(int, int)> calc = [&](int u, int p) {
    for (auto [v, w] : g[u]) {
      if (v != p) {
        par[v] = u;
        up[v] = w;
        calc(v, u);
      }
    }
  };
  calc(0, -1);
  vector<kset> weights(n);
  vector<vector<long long>> dp(n, vector<long long>(2));
  function<void(int, int, int)> dfs = [&](int u, int p, int k) {
    weights[u].clip(deg[u] - k);
    weights[u].ops.clear();
    long long dp_sum = 0;
    for (auto [v, w] : g[u]) {
      if (v != p) {
        if (deg[v] <= k) {
          break;
        }
        dfs(v, u, k);
        long long mn = min(dp[v][0], dp[v][1]);
        dp_sum += mn;
        weights[u].insert(dp[v][1] - mn);
      }
    }
    assert(!weights[u].s.empty());
    dp[u][0] = dp_sum + weights[u].sum;
    dp[u][1] = dp_sum + weights[u].sum - *weights[u].s.begin() + up[u];
    weights[u].rollback();
  };
  vector<int> big(n);
  iota(big.begin(), big.end(), 0);
  sort(big.begin(), big.end(), [&](int i, int j) {
    return deg[i] > deg[j];
  });
  for (int k = 1; k < n; k++) {
    while (!big.empty()) {
      int u = big.back();
      if (deg[u] > k) {
        break;
      }
      big.pop_back();
      if (u != 0) {
        weights[par[u]].insert(up[u]);
      }
    }
    for (int u : big) {
      if (u == 0 || deg[par[u]] <= k) {
        dfs(u, par[u], k);
        if (u == 0) {
          ans[k] += dp[u][0];
        } else {
          ans[k] += min(dp[u][0], dp[u][1]);
        }
      }
    }
  }
  return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

roads.cpp: In member function 'void kset::rollback()':
roads.cpp:35:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   35 |       auto [t, x] = ops.back();
      |            ^
roads.cpp: In lambda function:
roads.cpp:69:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   69 |     for (auto [v, w] : g[u]) {
      |               ^
roads.cpp: In lambda function:
roads.cpp:84:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   84 |     for (auto [v, w] : g[u]) {
      |               ^
#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...