Submission #1226441

#TimeUsernameProblemLanguageResultExecution timeMemory
1226441angelolanRace (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
// Pura Gente del Coach Moy y la Alexbriza
  
struct CentroidDecomposition {
  int N, K;
  vector<vector<pair<int, int>>> g;
  vector<int> sz;
  vector<bool> taken;
  vector<int> minEdges;
  int ans;
 
  CentroidDecomposition(int N, int K) : N(N), K(K), g(N), sz(N), taken(N), minEdges(K + 1, N), ans(N) {}

  void addEdge(int u, int v, int w) {
    g[u].emplace_back(v, w), g[v].emplace_back(u, w);
  }
  
  int getSize(int u, int p) {
    sz[u] = 1;
    for (auto [v, _] : g[u]) {
      if (v != p && !taken[v]) {
        sz[u] += getSize(v, u);
      }
    }
    return sz[u];
  }

  template <class F>
  void traverse(int u, int p, int l, int d, F&& f) {
    if (l > K) {
      return;
    }
    f(l, d);
    for (auto [v, w] : g[u]) {
      if (v != p && !taken[v]) {
        traverse(v, u, l + w, d + 1, f);
      }
    }
  }

  void decompose(int u, int globalSz) {
    if (globalSz == -1) {
      globalSz = getSize(u, -1);
    }
    for (auto [v, _] : g[u]) {
      if (!taken[v] && 2 * sz[v] >= globalSz) {
        sz[u] = 0;
        decompose(v, globalSz);
        return;
      }
    }

    taken[u] = true;
    for (auto [v, w] : g[u]) {
      if (!taken[v]) {
        traverse(v, u, w, 1, [&](int l, int d) { ans = min(ans, d + minEdges[K - l]); });
        traverse(v, u, w, 1, [&](int l, int d) { minEdges[l] = min(minEdges[l], d); });
      }
    }
    
    for (auto [v, _] : g[u]) {
      if (!taken[v]) {
        decompose(v, -1);
      }
    }
  }
  
  int solve() {
    minEdges[0] = 0;
    if (!K) {
      return 0;
    }
    decompose(0, -1);
    return ans;
  }
};

int best_path(int N, int K, int H[][2], int L[]) {
  CentroidDecomposition cd(N, K);
  for (int i = 0; i < N - 1; ++i) {
    cd.addEdge(H[i][0], H[i][1], L[i]);
  }
  int ans = cd.solve();
  return ans == N ? -1 : ans;
}

int main() {
  cin.tie(0)->sync_with_stdio(0);

  int N, K;
  cin >> N >> K;

  int H[N - 1][2], L[N - 1];
  for (int i = 0; i < N - 1; ++i) {
    cin >> H[i][0] >> H[i][1] >> L[i];
  }
  cout << best_path(N, K, H, L) << '\n';
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccsqPgnt.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cc9dPRCF.o:race.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status