제출 #1346248

#제출 시각아이디문제언어결과실행 시간메모리
1346248eldorbek_008경주 (Race) (IOI11_race)C++20
100 / 100
320 ms34380 KiB
#include <bits/stdc++.h>
using namespace std;

// #define int int64_t

int min(int a, int b) {
  return (a < b ? a : b);
}
int max(int a, int b) {
  return (a < b ? b : a);
}

const int inf = 2e9;

int best_path(int n, int k, int h[][2], int l[]) {
  // ios :: sync_with_stdio(false);
  // cin.tie(nullptr);

  // int n, k;
  // cin >> n >> k;
  // vector<int> l(n);
  // vector<pair<int, int>> h(n);
  // for (int i = 1; i <= n - 1; i++) {
  //   cin >> h[i].first >> h[i].second;
  // }
  // for (int i = 1; i <= n - 1; i++) {
  //   cin >> l[i];
  // }

  vector<vector<pair<int, int>>> g(n + 1);
  for (int i = 0; i < n - 1; i++) {
    g[h[i][0]].emplace_back(h[i][1], l[i]);
    g[h[i][1]].emplace_back(h[i][0], l[i]);
  }

  vector<int> sz(n + 1);
  vector<int> vis(n + 1);

  auto dfs_sz = [&](auto dfs_sz, int u, int p) -> void {
    sz[u] = 1;
    for (auto [v, w] : g[u]) {
      if (v != p and !vis[v]) {
        dfs_sz(dfs_sz, v, u);
        sz[u] += sz[v];
      }
    }
  };

  auto find_c = [&](auto find_c, int u, int p, int tot) -> int {
    for (auto [v, w] : g[u]) {
      if (v != p and !vis[v] and sz[v] > tot / 2) {
        return find_c(find_c, v, u, tot);
      }
    }
    return u;
  };

  int ans = inf;
  vector<int> edit;
  vector<int> E(k + 1, inf);

  E[0] = 0;

  auto calc = [&](auto calc, int u, int p, int W, int e, int upd) -> void {
    if (W > k)
      return;
    if (upd == 1) {
      if (E[W] > e) {
        E[W] = e;
        edit.emplace_back(W);
      }
    } else {
      ans = min(ans, e + E[k - W]);
    }

    for (auto [v, w] : g[u]) {
      if (!vis[v] and v != p) {
        calc(calc, v, u, W + w, e + 1, upd);
      }
    }
  };

  auto solve = [&](auto solve, int u) -> void {
    dfs_sz(dfs_sz, u, -1);
    int centroid = find_c(find_c, u, -1, sz[u]);
    
    vis[centroid] = 1;

    for (auto [v, w] : g[centroid]) {
      if (!vis[v]) {
        calc(calc, v, centroid, w, 1, 0);
        calc(calc, v, centroid, w, 1, 1);
      }
    }

    for (int &x : edit) {
      E[x] = inf;
    }
    edit.clear();

    for (auto [v, w] : g[centroid]) {
      if (!vis[v]) {
        solve(solve, v);
      }
    }
  };

  solve(solve, 0);
  if (ans == inf) {
    return -1;
  } else {
    return ans;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...