Submission #1012996

#TimeUsernameProblemLanguageResultExecution timeMemory
1012996aufanRace (IOI11_race)C++17
100 / 100
281 ms76524 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

int best_path(int n, int k, int h[][2], int l[]) { 
  vector<vector<pair<int, int>>> v(n);
  for (int i = 0; i < n - 1; i++) {
    int a = h[i][0], b = h[i][1], c = l[i];
    v[a].push_back({b, c});
    v[b].push_back({a, c});
  }

  int tim = -1;
  vector<int> sz(n), big(n, -1), tin(n), tout(n), idx(n), dep(n);
  vector<long long> d(n);

  function<void(int, int)> dfs = [&](int x, int p) {
    sz[x] = 1;
    tin[x] = ++tim;
    idx[tim] = x;

    for (auto [z, c] : v[x]) {
      if (z == p) continue;

      d[z] = d[x] + c;
      dep[z] = dep[x] + 1;

      dfs(z, x);

      sz[x] += sz[z];
      if (big[x] == -1 || sz[z] > sz[big[x]]) big[x] = z;
    }

    tout[x] = tim;
  };

  dfs(0, 0);

  int ans = INF;
  map<long long, int> mp;

  function<void(int, int, bool)> solve = [&](int x, int p, bool del) {
    for (auto [z, c] : v[x]) {
      if (z == p || z == big[x]) continue;

      solve(z, x, 1);
    }

    if (big[x] != -1) solve(big[x], x, 0);

    for (auto [z, c] : v[x]) {
      if (z == p || z == big[x]) continue;
      
      for (int tim = tin[z]; tim <= tout[z]; tim++) {
        int z = idx[tim];
        if (mp.count(d[x] + k - (d[z] - d[x]))) ans = min(ans, mp[d[x] + k - (d[z] - d[x])] + dep[z] - 2 * dep[x]); 
      }
      
      for (int tim = tin[z]; tim <= tout[z]; tim++) {
        int z = idx[tim];
        if (!mp.count(d[z])) mp.insert({d[z], dep[z]});
        else mp[d[z]] = min(mp[d[z]], dep[z]);
      }
    }

    if (mp.count(d[x] + k)) ans = min(ans, mp[d[x] + k] - dep[x]);
    

    if (!mp.count(d[x])) mp.insert({d[x], dep[x]});
    else mp[d[x]] = min(mp[d[x]], dep[x]);

    if (del) mp.clear();
  };

  solve(0, 0, 0);
  if (ans == INF) ans = -1;

  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...