제출 #1133431

#제출 시각아이디문제언어결과실행 시간메모리
1133431alecurse경주 (Race) (IOI11_race)C++20
100 / 100
307 ms79936 KiB
#include "race.h"
#include <bits/stdc++.h>
#define mp make_pair
using namespace std;
int bestres=1e9;
vector<vector<pair<int,int> > > adj;
vector<pair<unordered_map<int,int>, int> > v;
void dfs(int x, int e, int dph, int K) {
  for(auto el : adj[x]) {
    int b = el.first, w = el.second;
    if(b==e)
      continue;
    dfs(b,x,dph+1,K);
    v[b].first[-v[b].second]=dph+1;
    v[b].second+=w;
    if(v[b].first.size()>v[x].first.size()) {
      swap(v[b],v[x]);
    }
    if(v[x].first.count(K-v[x].second)) {
      bestres=min(bestres,v[x].first[K-v[x].second]-dph);
    }
    if(v[b].first.count(K-v[b].second)) {
      bestres=min(bestres,v[b].first[K-v[b].second]-dph);
    }
    for(auto el : v[b].first) {
      int realel = el.first+v[b].second;
      if(v[x].first.count(K-realel-v[x].second)) {
        bestres=min(bestres,v[x].first[K-realel-v[x].second]+el.second-2*dph);
      }
    }
    for(auto el : v[b].first) {
      int realel = el.first+v[b].second;
      if(v[x].first.count(realel-v[x].second)) {
        v[x].first[realel-v[x].second]=min(v[x].first[realel-v[x].second],el.second);
      } else {
        v[x].first[realel-v[x].second]=el.second;
      }
    }
  }
}

int best_path(int N, int K, int H[][2], int L[])
{
  v.resize(N);
  adj.resize(N);
  for(int i=0;i<N-1;i++) {
    adj[H[i][0]].push_back(mp(H[i][1],L[i]));
    adj[H[i][1]].push_back(mp(H[i][0],L[i]));
  }
  dfs(0,0,0,K);
  if(bestres==1e9)
    return -1;
  return bestres;
}

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