제출 #1163292

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

int k;
int res = pow(10, 9);
vector<vector<pair<int,int>>> g;
vector<bool> cut;
vector<int> s;
vector<unordered_map<int,int>> d;

void dfs(int cur, int p){
  s[cur] = 1;
  for (auto [next, l] : g[cur]){
    if (next == p || cut[next]) continue;
    dfs(next, cur);
    s[cur] += s[next];
  }
}

void dfs2(int cur, int p, int st, int dist, int ul){
  if (dist > k) return;
  if (dist == k) res = min(res, ul);
  if (d[st].find(dist) == d[st].end()) d[st][dist] = ul;
  else d[st][dist] = min(d[st][dist], ul);
  for (auto [next, l] : g[cur]){
    if (next == p || cut[next]) continue;
    dfs2(next, cur, st, dist+l, ul+1);
  }
}

int centroid(int cur){
  dfs(cur, cur);
  if (s[cur] <= 2) return cur;
  int lim = s[cur]/2;
  int par = cur;
  while (true){
    int bo = -1;
    for (auto [next, l] : g[cur]){
      if (next == par || cut[next]) continue;
      if (s[next] >= lim) bo = next;
    }
    if (bo == -1) break;
    par = cur;
    cur = bo;
  }
  return cur;
}

void solve(int cur){
  int x = centroid(cur);
  unordered_map<int,int> um;
  for (auto [next, l] : g[x]){
    if (cut[next]) continue;
    d[next].clear();
    dfs2(next, x, next, l, 1);
    if (!um.empty()){
      for (auto [dist, ul] : d[next]){
        if (um.find(k-dist) != um.end()) res = min(res, ul+um[k-dist]);
      }
    }
    for (auto [dist, ul] : d[next]){
      if (um.find(dist) == um.end()) um[dist] = ul;
      else um[dist] = min(um[dist], ul);
    }
  }
  cut[x] = true;
  for (auto [next, l] : g[x]){
    if (!cut[next]) solve(next);
  }
}

int best_path(int N, int K, int H[][2], int L[]){
  k = K;
  g.resize(N);
  for (int i=0; i<N-1; i++){
    g[H[i][0]].push_back({H[i][1], L[i]});
    g[H[i][1]].push_back({H[i][0], L[i]});
  }
  cut.resize(N, false);
  s.resize(N);
  d.resize(N);
  solve(0);
  if (res == pow(10, 9)) return -1;
  return res;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...