이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "race.h"
#include <bits/stdc++.h>
#define pii pair<int, int>
#define x first
#define y second
#define MAXN 200015
#define MAXC 1000005
using namespace std;
int sz[MAXN], dep[MAXN], mx[MAXN], use[MAXN];
int ans = 2e9, t = 0, k, in[MAXN], out[MAXN], tag = 0;
vector<pii> g[MAXN];
vector<int> path;
multiset<pii> st;
void dfs(int p, int lp) {
sz[p] = 1;
mx[p] = -1;
path.push_back(p);
in[p] = t++;
for (auto [i, c] : g[p]) {
if (i != lp) {
dep[i] = dep[p] + c;
use[i] = use[p] + 1;
dfs(i, p);
sz[p] += sz[i];
mx[p] = (mx[p] == -1 || sz[mx[p]] < sz[i]) ? i : mx[p];
}
}
out[p] = t;
}
int query(int p, int i) {
if (st.empty())
return 2e9;
int need = k + 2 * dep[p] - dep[i];
auto it = st.lower_bound(pii(need, -1));
if (it != st.end() && (it->x) == need)
return it->y;
return 2e9;
}
void dfs1(int p, int lp, bool flag) {
for (auto [i, c] : g[p]) {
if (i != lp && i != mx[p])
dfs1(i, p, 0);
}
if (mx[p] >= 0)
dfs1(mx[p], p, 1);
for (auto [i, c] : g[p]) {
if (i != lp && i != mx[p]) {
for (int j = in[i]; j < out[i]; j++) {
int a = path[j];
ans = min(ans, use[a] + query(p, a) - 2 * use[p]);
}
for (int j = in[i]; j < out[i]; j++) {
int a = path[j];
st.insert(pii(dep[a], use[a]));
}
}
}
ans = min(ans, use[p] + query(p, p) - 2 * use[p]);
st.insert(pii(dep[p], use[p]));
if (!flag) {
for (int i = in[p]; i < out[p]; i++) {
int a = path[i];
st.erase(st.find(pii(dep[a], use[a])));
}
}
}
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]].push_back({H[i][1], L[i]});
g[H[i][1]].push_back({H[i][0], L[i]});
}
dfs(0, 0);
dfs1(0, 0, 1);
return ans > N ? -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... |