Submission #500618

#TimeUsernameProblemLanguageResultExecution timeMemory
500618JooRace (IOI11_race)C++17
100 / 100
422 ms89796 KiB
#include "race.h"
#include <bits/stdc++.h>
#define DEBUG 0
using namespace std;
 
const int INF = 1e9, MAXN = 2e5+10;
 
int dep[MAXN], ans = INF;
long long qs[MAXN];
vector<pair<int,int>> G[MAXN];
map<long long, int> mp[MAXN];
 
void dfs1(int u, int p){
  for(auto [v, w] : G[u]){
    if(v == p) continue;
    dep[v] = dep[u]+1;
    qs[v] = qs[u]+w;
    dfs1(v, u);
  }
}
 
void dfs2(int u, int p, long long K){
  for(auto [v, w] : G[u]){
    if(v == p) continue;
    dfs2(v, u, K);
 
    if(mp[v].size() > mp[u].size()){
      swap(mp[v], mp[u]);
    }
  }
 
  for(auto [v, w] : G[u]){
    if(v == p) continue;
    for(auto &[key, val] : mp[v]){
      long long tmp = K-key+2ll*qs[u];
      if(mp[u].find(tmp) != mp[u].end()){
        ans = min(ans, val+mp[u][tmp]-2*dep[u]);
      }
    }
 
    for(auto &[key, val] : mp[v]){
      if(mp[u].find(key) != mp[u].end()){
        mp[u][key] = min(mp[u][key], val);
      } else {
        mp[u][key] = val;
      }
    }
  }
 
  if(mp[u].find(K+qs[u]) != mp[u].end()){
    ans = min(ans, mp[u][K+qs[u]]-dep[u]);
  }
  mp[u][qs[u]] = dep[u];
}
 
int best_path(int N, int K, int H[][2], int L[])
{
  for(int i = 0; i < N-1; i++){
    int u = H[i][0], v = H[i][1];
    G[u].emplace_back(v, L[i]);
    G[v].emplace_back(u, L[i]);
  }
 
  dep[0] = 1;
  dfs1(0, -1);
 
  // for(int i = 0; i < N; i++) cout << dep[i] << " " << qs[i] << "\n";
  
  dfs2(0, -1, K);
 
 
  if(ans >= INF) ans = -1;
  
  return ans;
}
/*
int main(void){
  int N, K; cin >> N >> K;
  int H[N-1][2], L[N-1];
  for(int i = 0; i < N-1; i++) cin >> H[i][0] >> H[i][1] >> L[i];
  int res; cin >> res;
 
  int cal = best_path(N, K, H, L);
 
  cout << cal << " " << res << "\n";
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...