Submission #1128655

#TimeUsernameProblemLanguageResultExecution timeMemory
1128655VinhLuuRace (IOI11_race)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#define ll long long
#define all(lpv) lpv.begin(), lpv.end()
#define pot(x, y) lower_bound(x.begin(), x.end(), y) - x.begin() + 1
using namespace std;

//#define lpv

#ifndef lpv
#include "race.h"
#endif // lpv

#define int long long

const int N = 1e6 + 5;

int ans, n, k, d[N], dp[N], sum, cent, sub[N];
vector<pair<int,int>> p[N];
bool del[N];
const int oo = 1e9;

void pre(int u,int v) {
  sub[u] = 1;
  sum++;
  for(auto ptr : p[u]) {
    int j, w; tie(j, w) = ptr;
    if(j == v || del[j]) continue;
    pre(j, u);
    sub[u] += sub[j];
  }
}

int FIND(int u,int v) {
  for(auto ptr : p[u]) {
    int j, w; tie(j, w) = ptr;
    if(del[j] || j == v) continue;
    if(sub[j] > sum / 2) return FIND(j, u);
  }
  return u;
}

vector<int> collect;
vector<pair<int,int>> vr;

void sol(int u,int v, int edge) {
  if(d[u] > k) return;
  collect.push_back(d[u]);
  vr.push_back({d[u], edge});
  ans = min(ans, edge + dp[k - d[u]]);
//  cerr << u << " " << v << " " << edge << " " << d[u] << " " << dp[k - d[u]] << " t\n";
  for(auto ptr : p[u]) {
    int j, w; tie(j, w) = ptr;
    if(j == v || del[j]) continue;
    d[j] = d[u] + w;
    sol(j, u, edge + 1);
  }
}

void cen(int u) {
  sum = 0;
  pre(u, 0);
  cent = FIND(u, 0);
  del[cent] = 1;

  d[cent] = 0;
  dp[0] = 0;
  collect.clear();
  collect.push_back(0);
  for(auto ptr : p[cent]) {
    int j, w; tie(j, w) = ptr;
    if(del[j]) continue;
    vr.clear();
    d[j] = d[cent] + w;
    sol(j, u, 1);
    for(auto tmp : vr) {
      int x, y; tie(x, y) = tmp;
      dp[x] = min(dp[x], y);
    }
  }

//  cerr << cent << " t\n";
//  for(auto j : collect) cerr << j << " ";
//  cerr << "\n";

  for(auto j : collect) dp[j] = oo;

  for(auto ptr : p[cent]) {
    int j, w; tie(j, w) = ptr;
    if(del[j]) continue;
    cen(j);
  }
}

void dfs(int u,int v,int edge,int wet) {
  if(wet == k) ans = min(ans, edge);
  for(auto ptr : p[u]) {
    int j, w; tie(j, w) = ptr;
    if(j == v) continue;
    dfs(j, u, edge + 1, wet + w);
  }
}

int best_path(int _n, int _k, int H[][2], int L[]) {
  n = _n, k = _k;
  ans = n;
  for(int i = 1; i < n; i ++) {
    int x = H[i - 1][0] + 1, y = H[i - 1][1] + 1, c = L[i - 1];
//    cerr << x << " " << y << " " << c << " f\n";
    p[x].push_back({y, c});
    p[y].push_back({x, c});
  }


  if(n <= 1000) for(int i = 1;i <= n; i ++) dfs(i, 0, 0, 0);
  else {
    for(int i = 0; i <= k; i ++) dp[i] = oo;
    cen(1);
  }
//  cerr << ans << " result\n";
  return (ans == n ? -1 : ans);
}


#ifdef lpv
int h[N][2], l[N];
signed main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  #define task "v"
  if(fopen(task ".inp","r")) {
    freopen(task ".inp","r",stdin);
    freopen(task ".out","w",stdout);
  }

  int _n, _k; cin >> _n >> _k;

  for(int i = 1; i < _n; i ++) {
    cin >> h[i - 1][0] >> h[i - 1][1] >> l[i - 1];
  }

  cout << best_path(_n, _k, h, l);


}

#endif // lpv

Compilation message (stderr)

/usr/bin/ld: /tmp/ccEAB8eK.o: in function `main':
grader.cpp:(.text.startup+0x28): undefined reference to `best_path(int, int, int (*) [2], int*)'
collect2: error: ld returned 1 exit status