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 <bits/stdc++.h>
#include "race.h"
using namespace std;
#define endl '\n'
#define ll long long
#define all(x) x.begin(), x.end()
vector<pair<int, int>> g[200005];
bool processed[200005];
ll sz[200005];
int getSize(int cur, int par = -1) {
sz[cur] = 1;
for (auto next : g[cur]) {
if (next.first != par && !processed[next.first]) sz[cur] += getSize(next.first, cur);
}
return sz[cur];
}
int getCentroid(int cur, int des, int par = -1) {
for (auto next : g[cur]) {
if (next.first != par && !processed[next.first] && sz[next.first] > des / 2) return getCentroid(next.first, des, cur);
}
return cur;
}
ll ans = 10e7, k, depths[1000005];
vector<int> v;
void solve(int cur, int par, ll depth, ll sum, int t) {
if (sum > k || depth >= ans) return;
if (t == 0) ans = min(ans, depth + depths[k - sum]);
if (t == 1) {
depths[sum] = min(depths[sum], depth);
v.push_back(sum);
}
for (auto next : g[cur]) {
if (next.first != par && !processed[next.first]) {
solve(next.first, cur, depth + 1, sum + next.second, t);
}
}
}
void decompose(int cur = 0) {
int centroid = getCentroid(cur, getSize(cur));
processed[centroid] = 1;
for (auto x : v) depths[x] = 10e7;
v.clear();
depths[0] = 0;
for (auto next : g[centroid]) {
if (!processed[next.first]) {
solve(next.first, -1, 1, next.second, 0);
solve(next.first, -1, 1, next.second, 1);
}
}
for (auto next : g[centroid]) {
if (!processed[next.first]) decompose(next.first);
}
}
int best_path(int N, int K, int H[][2], int L[]) {
k = K;
for (int i = 0; i <= k; i++) depths[i] = 10e7;
ans = N;
for (int i = 0; i < N - 1; i++) {
g[H[i][0]].push_back({H[i][1], L[i]});
g[H[i][1]].push_back({H[i][0], L[i]});
}
decompose();
if (ans == N) return -1;
else return 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... |