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 pii pair<int, int>
#define x first
#define y second
const int N = 2e5+5;
int n, k;
int dep[N], pos[N], in[N], out[N], sz[N];
long d[N];
vector<pii> g[N];
void get_sz(int u, int p) {
static int idx = 0;
in[u] = ++idx, pos[idx] = u, sz[u] = 1;
if(u) for(auto it = g[u].begin();;++it) if(it->x == p) {
g[u].erase(it); break;
}
for(pii &v : g[u]) {
d[v.x] = d[u] + v.y;
dep[v.x] = dep[u] + 1;
get_sz(v.x, u), sz[u] += sz[v.x];
if(sz[g[u][0].x] < sz[v.x]) swap(v, g[u][0]);
}
out[u] = idx;
}
int ans = 1e9;
map<long, int> M;
void setMap(int u) {
if(M[d[u]] == 0) M[d[u]] = dep[u];
else M[d[u]] = min(M[d[u]], dep[u]);
}
void getVal(int u, int lca) {
long val = k - d[u] + 2*d[lca];
int ret = M[val];
if(ret != 0) {
int z = ret + dep[u] - 2 * dep[lca];
ans = min(ans, z);
}
}
void solve(int u, bool keep) {
for(pii v : g[u]) if(v != g[u][0]) solve(v.x, false);
if(g[u].size()) solve(g[u][0].x, true);
getVal(u, u), setMap(u);
for(pii v : g[u]) if(v != g[u][0]) {
for(int i = in[v.x]; i <= out[v.x]; ++i) getVal(pos[i], u);
for(int i = in[v.x]; i <= out[v.x]; ++i) setMap(pos[i]);
}
if(!keep) M.clear();
}
int best_path(int N, int K, int H[][2], int L[]) {
k= K;
for(int i = 0; i < N-1; ++i) {
g[H[i][0]].emplace_back(H[i][1], L[i]);
g[H[i][1]].emplace_back(H[i][0], L[i]);
}
dep[0] = 1;
get_sz(0, -1);
solve(0, false);
return (ans == (int)1e9 ? -1 : ans);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |