제출 #1363041

#제출 시각아이디문제언어결과실행 시간메모리
1363041aaaaaaaaRoad Closures (APIO21_roads)C++20
컴파일 에러
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;

const int N = 3e5 + 9;
using ll = long long;
const ll inf = 1e18;
vector<pair<int, int>> g[N];


int par[N][20], dep[N], sz[N], st[N], en[N], T;
map<int, int> W[N];
void dfs_pre(int u, int pre = 0) {
  par[u][0] = pre;
  dep[u] = dep[pre] + 1;
  sz[u] = 1;
  st[u] = ++T;
  for (int i = 1; i <= 18; i++) par[u][i] = par[par[u][i - 1]][i - 1];
  for (auto [v, w] : g[u]) {
    if (v == pre) continue;
    dfs_pre(v, u);
    sz[u] += sz[v];
  }
  en[u] = T;
}
int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int k = 18; k >= 0; k--) if (dep[par[u][k]] >= dep[v]) u = par[u][k];
  if (u == v) return u;
  for (int k = 18; k >= 0; k--) if (par[u][k] != par[v][k]) u = par[u][k], v = par[v][k];
  return par[u][0];
}
int kth(int u, int k) {
  for (int i = 0; i <= 18; i++) if (k & (1 << i)) u = par[u][i];
  return u;
}
int dist(int u, int v) {
  int lc = lca(u, v);
  return dep[u] + dep[v] - 2 * dep[lc];
}
int isanc(int u, int v) {
  return (st[u] <= st[v]) && (en[v] <= en[u]);
}
vector<pair<int, int>> t[N];

vector<int> buildtree(vector<int> v) {
  sort(v.begin(), v.end(), [](int x, int y) {
    return st[x] < st[y];
  });
  int s = v.size();
  for (int i = 0; i < s - 1; i++) {
    int lc = lca(v[i], v[i + 1]);
    v.push_back(lc);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  sort(v.begin(), v.end(), [](int x, int y) {
    return st[x] < st[y];
  });
  stack<int> st;
  st.push(v[0]);
  for (int i = 1; i < v.size(); i++) {
    while (!isanc(st.top(), v[i])) st.pop();
    t[st.top()].push_back({v[i], 0});
    st.push(v[i]);
  }
  return v;
}




ll dp[N][2];
int x, par_edge[N];
void dfs0(int u, int p = 0) {
  for (auto [v, w]: t[u]) {
    if (v ^ p) {
      par_edge[v] = w;
      dfs0(v, u);
    }
  }
}
void dfs(int u, int p = 0) {
  ll tot = 0;
  vector<ll> vec;
  for (auto [v, w]: t[u]) {
    if (v ^ p) {
      dfs(v, u);
      tot += dp[v][0];
      vec.push_back(dp[v][1] - dp[v][0]);
    }
  }
  sort(vec.begin(), vec.end());
  for (int i = 1; i < vec.size(); i++) {
    vec[i] += vec[i - 1];
  }
  int sz = vec.size(), add = p > 0;
  if (x == 0 and p > 0) {
    dp[u][0] = inf;
  }
  else {
    int del = max(0, sz + add - x);
    dp[u][0] = inf;
    for (int i = del - 1; i < sz; i++) {
      dp[u][0] = min(dp[u][0], tot + (i < 0 ? 0 : vec[i]));
    }
  }
  if (p > 0) {
    int del = max(0, sz - x);
    dp[u][1] = inf;
    for (int i = del - 1; i < sz; i++) {
      dp[u][1] = min(dp[u][1], tot + (i < 0 ? 0 : vec[i]));
    }
    dp[u][1] += par_edge[u];
  }
  else {
    dp[u][1] = inf;
  }
}
int deg[N];
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n; cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v, w; cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
    deg[u]++;
    deg[v]++;
    W[u][v] = w;
    W[v][u] = w;
  }
  dfs_pre(1);

  vector<pair<int, int>> vec;
  for (int i = 1; i <= n; i++) {
    vec.push_back({deg[i], i});
  }
  sort(vec.rbegin(), vec.rend());
  for (x = 0; x < n; x++) {
    set<int> important;
    for (auto [d, u]: vec) {
      if (d < x) break;
      important.insert(u);
      // if (par[u][0]) {
      //   important.insert(par[u][0]);
      // }
      for (auto [v, w]: g[u]) {
        important.insert(v);
      }
    }
    if (important.empty()) {
      cout << 0 << ' ';
      continue;
    }
    vector<int> imp(important.begin(), important.end());
    auto nodes = buildtree(imp);
    for (auto u: nodes) {
      for (auto &[v, w]: t[u]) {
        if (W[u].find(v) != W[u].end()) {
          w = W[u][v];
        }
        // cout << u << ' ' << v << ' ' << w << '\n';
      }
    }
    int root = nodes.front();
    dfs0(root);
    dfs(root);
    cout << dp[root][0] << ' ';
    for (auto u: nodes) {
      t[u].clear();
    }
  }
  return 0;
}

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

/usr/bin/ld: /tmp/ccUWyCxG.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccgMeNab.o:roads.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccUWyCxG.o: in function `main':
grader.cpp:(.text.startup+0x26e): undefined reference to `minimum_closure_costs(int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status