# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1053245 | vincentbucourt1 | Race (IOI11_race) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
const static int INF = 1e9;
const int MAXN = 200001;
static int N, sumNeed;
static vector<pair<int, int>> adj[MAXN];
static int depth[MAXN], sum[MAXN];
static map<int, int> maps[MAXN];
static int ans = INF;
void dfs (int node = 0, int parent = -1) {
maps[node][sum[node]] = depth[node];
for (pair<int, int> nxt : adj[node]) {
int nodenxt = nxt.f, weightnxt = nxt.s;
if (nodenxt == parent) continue;
depth[nodenxt] = depth[node] + 1;
sum[nodenxt] = sum[node] + weightnxt;
dfs(nodenxt, node);
if (maps[nodenxt].size() > maps[node].size()) swap(maps[nodenxt], maps[node]);
for (pair<ll, ll> elem : maps[nodenxt]) {
int sumOn = elem.f, depthOn = elem.s;
int need = -sumOn + 2*sum[node] + sumNeed;
if (maps[node].find(need) != maps[node].end()) {
ans = min(ans, maps[node][need] - 2*depth[node] + depthOn);
}
if (maps[node].find(sumOn) == maps[node].end()) {
maps[node][sumOn] = depthOn;
}
else {
maps[node][sumOn] = min(maps[node][sumOn], depthOn);
}
}
maps[nodenxt].clear();
}
}
int best_path(int N, int K, int H[][2], int L[])
{
::N = N;
sumNeed = K;
for (int i = 0; i < N-1; i++) {
adj[H[i][0]].push_back({H[i][1], L[i]});
adj[H[i][1]].push_back({H[i][0], L[i]});
}
dfs();
if (ans == INF) return -1;
else return ans;
}