Submission #1245676

#TimeUsernameProblemLanguageResultExecution timeMemory
1245676julia_08Race (IOI11_race)C++20
100 / 100
348 ms58992 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;

using ll = long long;

const int MAXN = 2e5 + 10;

ll dist[MAXN];

vector<pair<int, ll>> adj[MAXN];

map<ll, int> freq[MAXN];

int ans, k;

void merge(int u, int v, int d){

  if(freq[u].size() > freq[v].size()) swap(freq[u], freq[v]);

  for(auto x : freq[u]){
    if(freq[v].count(k + 2 * dist[v] - x.first)){
      ans = min(ans, x.second + freq[v][k + 2 * dist[v] - x.first] - 2 * d);
    }
  }

  for(auto x : freq[u]){
    if(freq[v].count(x.first)){
      freq[v][x.first] = min(freq[v][x.first], x.second);
    } else freq[v][x.first] = x.second;
  }

  freq[u].clear();

}

void dfs(int v, int p, int d){

  freq[v][dist[v]] = d;

  for(auto [u, w] : adj[v]){
    if(u != p){
      dist[u] = dist[v] + w;
      dfs(u, v, d + 1);
      merge(u, v, d);
    }
  }

}

int best_path(int n, int k_, int h[][2], int l[]){
    
  k = k_;

  for(int i=0; i<n-1; i++){
    adj[h[i][0] + 1].push_back({h[i][1] + 1, l[i]});
    adj[h[i][1] + 1].push_back({h[i][0] + 1, l[i]});
  }

  ans = 1e9;

  dfs(1, 1, 0);

  return (ans == 1e9 ? -1 : 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...