Submission #1258628

#TimeUsernameProblemLanguageResultExecution timeMemory
1258628papauloRace (IOI11_race)C++20
100 / 100
248 ms80088 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;

#define MAXN 200200
vector<pair<int, int>> adj[MAXN];
using ll = long long;
ll bonus[MAXN];
int sti[MAXN];
unordered_map<ll, int> mp[MAXN];

int ans=1e9;

ll k;

void dfs(int v, int p, int d) {
  int id=-1;
  for(auto e : adj[v]) {
    int u=e.first, w=e.second;
    if(u==p) continue;
    dfs(u, v, d+1);
    if(id<0||mp[sti[u]].size()>mp[id].size()) {
      id=sti[u];
      bonus[v]=bonus[u]+w;
    }
  }
  if(id<0) {
    id=v;
    bonus[v]=0LL;
  }
  for(auto e : adj[v]) {
    int u=e.first, w=e.second;
    if(u==p||sti[u]==id) continue;
    for(auto pr : mp[sti[u]]) {
      ll cur=pr.first+w+bonus[u];
      auto p = mp[id].find(k-cur-bonus[v]);
      if(p==mp[id].end()) continue;
      ans=min(ans, p->second+pr.second-2*d);
    }
    for(auto pr : mp[sti[u]]) {
      ll cur=pr.first+w+bonus[u]-bonus[v];
      auto p = mp[id].find(cur);
      if(p==mp[id].end()) {
        mp[id][cur]=pr.second;
      } else {
        p->second=min(p->second, pr.second);
      }
    }
  }
  auto p2 = mp[id].find(k-bonus[v]);
  if(p2!=mp[id].end()) {
    ans=min(ans, p2->second-d);
  }
  mp[id][-bonus[v]]=d;
  sti[v]=id;
}

int best_path(int N, int K, int H[][2], int L[])
{
  k=K;
  for(int i=0;i<N-1;i++) {
    int v=H[i][0], u=H[i][1], w=L[i];
    adj[v].push_back({u, w});
    adj[u].push_back({v, w});
  }
  dfs(0, -1, 0);
  if(ans==1e9) ans=-1;
  return 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...