#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define SZ(x) int(x.size())
#define mins(a, b) (a = min(a,b))
const int MXN = 5e5+5;
const int LOG = 20;
vector<pii> g[MXN];
int h[MXN];
ll H[MXN];
vector<pii> rmq[LOG];
int pos[MXN];
void dfs(int v, int p=0) {
pos[v] = SZ(rmq[0]);
rmq[0].pb(pii(h[v], v));
for(auto pp : g[v]) {
int u = pp.first, w = pp.second;
if(u!=p) {
h[u] = h[v]+1;
H[u] = H[v]+w;
dfs(u, v);
rmq[0].pb(pii(h[v], v));
}
}
}
inline int LCA(int u, int v) {
if((u=pos[u])>(v=pos[v])) swap(u, v);
int lg = __lg(v-u+1);
return min(rmq[lg][u], rmq[lg][v-(1<<lg)+1]).second;
}
inline ll dis(int u, int v) {
return H[u] + H[v] - (H[LCA(u,v)]<<1);
}
int sz[MXN], par[MXN];
bool dead[MXN];
ll dp[MXN];
int get_sz(int v, int p=0) {
sz[v] = 1;
for(auto pp : g[v]) {
int u = pp.first;
if(!dead[u] && u!=p)
sz[v] += get_sz(u, v);
}
return sz[v];
}
int centorid(int v, int N, int p=0) {
for(auto pp : g[v]) {
int u = pp.first;
if(!dead[u] && u!=p && sz[u]+sz[u]>N)
return centorid(u, N, v);
}
return v;
}
int decompose(int v) {
dead[v = centorid(v, get_sz(v))] = 1;
dp[v] = 1e18;
for(auto pp : g[v]) {
int u = pp.first;
if(!dead[u])
par[decompose(u)] = v;
}
return v;
}
void Init(int N, int A[], int B[], int D[]) {
for(int i=0; i<N-1; i++) {
g[A[i]+1].pb(pii(B[i]+1, D[i]));
g[B[i]+1].pb(pii(A[i]+1, D[i]));
}
dfs(1);
for(int i=1; i<LOG; i++) {
rmq[i] = rmq[i-1];
for(int j=0; j+(1<<(i-1))<SZ(rmq[i]); j++)
mins(rmq[i][j], rmq[i-1][j+(1<<(i-1))]);
}
decompose(1);
}
long long Query(int S, int X[], int T, int Y[]) {
for(int i=0, v; i<S; i++) {
v = X[i]+1;
while(v) {
mins(dp[v], dis(v, X[i]+1));
v = par[v];
}
}
ll ans = 1e18;
for(int i=0, v; i<T; i++) {
v = Y[i]+1;
while(v) {
mins(ans, dp[v]+dis(v, Y[i]+1));
v = par[v];
}
}
for(int i=0, v; i<S; i++) {
v = X[i]+1;
while(v) {
dp[v] = 1e18;
v = par[v];
}
}
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... |