이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define ff first
#define ss second
const long long INF = 1e15;
int dfn[500005], dfnn, efn[500005], prt[19][500005];
int dep[500005];
long long D[500005];
vector<pii> edge[500005];
void dfs0(int x, int p) {
dfn[x] = ++dfnn;
for (auto i : edge[x]) {
if (i.ss == p) continue;
dep[dfnn + 1] = dep[dfn[x]] + 1;
D[dfnn + 1] = D[dfn[x]] + i.ff;
prt[0][dfnn + 1] = dfn[x];
dfs0(i.ss, x);
}
efn[dfn[x]] = dfnn;
}
int C[1000005], cnt, pv, XY[500005];
long long dp[500005][2], res;
void dfs(int x) {
dp[x][0] = dp[x][1] = INF;
if (XY[x] >= 0) dp[x][XY[x]] = 0;
XY[x] = 0;
while (pv < cnt && C[pv] <= efn[x]) {
int i = C[pv++];
dfs(i);
dp[x][0] = min(dp[x][0], dp[i][0] + D[i] - D[x]);
dp[x][1] = min(dp[x][1], dp[i][1] + D[i] - D[x]);
}
res = min(res, dp[x][0] + dp[x][1]);
}
int lca(int s, int e) {
if (dep[s] < dep[e]) swap(s, e);
for (int i = 18; i >= 0; --i)
if (((dep[s] - dep[e]) >> i) & 1) s = prt[i][s];
if (s == e) return s;
for (int i = 18; i >= 0; --i)
if (prt[i][s] != prt[i][e]) s = prt[i][s], e = prt[i][e];
return prt[0][s];
}
long long Query(int S, int X[], int T, int Y[]) {
cnt = 0;
for (int i = 0; i < S; ++i) C[cnt] = dfn[X[i]], XY[C[cnt++]] = 1;
for (int i = 0; i < T; ++i) C[cnt] = dfn[Y[i]], XY[C[cnt++]] = 2;
sort(C, C + cnt);
for (int i = cnt-1; i; --i) C[cnt++] = lca(C[i - 1], C[i]);
sort(C, C + cnt);
cnt = unique(C, C + cnt) - C;
res = INF, pv = 0;
dfs(1);
return res;
}
void Init(int N, int A[], int B[], int D[]) {
for (int i = 0; i < N - 1; ++i) {
edge[A[i]].emplace_back(D[i], B[i]);
edge[B[i]].emplace_back(D[i], A[i]);
}
dfs0(0, 0);
for (int i = 1; i < 19; ++i) for (int j = 1; j <= N; ++j) prt[i][j] = prt[i - 1][prt[i - 1][j]];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |