Submission #1339131

#TimeUsernameProblemLanguageResultExecution timeMemory
1339131al95ireyizRace (IOI11_race)C++20
21 / 100
224 ms14092 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define len(x) (ll)x.size()
const ll inf = 1e9, infl = 1e18;
const ll MOD = 1e9 + 7;
const ll maxn = 1e6 + 5;
ll n, m, k = 0;

#include "race.h"

mt19937 rng(time(0));
ll sz[maxn], vis[maxn], rn = 0;
array<ll, 2> a[maxn];
vector<array<ll, 2>> g[maxn];
ll dfs(ll u, ll p = -1){
  sz[u] = 1;
  for(auto [v, w] : g[u]){
    if(v == p or vis[v]) continue;
    sz[u] += dfs(v, u);
  }
  return sz[u];
}
ll fc(ll u, ll p, ll x){
  for(auto [v, w] : g[u]){
    if(v == p or vis[v]) continue;
    if(sz[v] >= sz[x] / 2) return fc(v, u, x);
  }
  return u;
}
void calc(ll u, ll p, ll cm, ll lv, set<array<ll, 2>> &ss){
  if(cm > m) return;
  ss.insert({cm, lv});
  for(auto [v, w] : g[u]){
    if(v == p or vis[v]) continue;
    calc(v, u, cm + w, lv + 1, ss);
  }
}
set<array<ll, 2>> ss;
void centree(ll u){
  dfs(u);
  ll cent = fc(u, -1, u);
  vis[cent] = 1;

  rn ++;
  for(auto [v, w] : g[cent]){
    ss.clear();
    calc(v, cent, w, 1, ss);

    for(auto [x, y] : ss){
      if(a[m - x][1] != rn) a[m - x] = {infl, rn};
      k = min(k, a[m - x][0] + y);
    }

    for(auto [x, y] : ss){
      if(a[x][1] != rn) a[x] = {infl, rn};
      a[x][0] = min(a[x][0], y);
    }
  }

  for(auto [v, w] : g[cent]) if(!vis[v]) centree(v);
}
int best_path(int N, int K, int H[][2], int L[]){
  n = N, m = K;
  for(ll i = 1; i <= n - 1; i ++){
    g[H[i - 1][0] + 1].push_back({H[i - 1][1] + 1, L[i - 1]});
    g[H[i - 1][1] + 1].push_back({H[i - 1][0] + 1, L[i - 1]});
  }

  k = infl;
  centree(1);
  if(k == infl) k = -1;
  return k;
}

// void _() {

// }
// signed main() {
//   cin.tie(0)->sync_with_stdio(0);
//   ll t = 1;
//   // cin >> t;
//   while(t --) _();
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...