이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;
#define nl '\n'
using ll = long long;
using E = array<int, 2>;
const int nax = 5e5+5;
vector<E> adj[nax];
bool vis[nax];
int par[nax], W[nax], siz[nax];
ll dx[nax], dy[nax];
const ll INFL = ll(1e18) + 10;
int find_size(int u, int p = -1) {
if (vis[u]) return 0;
siz[u] = 1;
for(auto e : adj[u]) {
auto [v, w] = e;
if (v == p) continue;
siz[u] += find_size(v, u);
}
return siz[u];
}
int find_centroid(int u, int p, int n) {
for(auto e : adj[u]) {
auto [v, w] = e;
if (v == p) continue;
if (!vis[v] && siz[v] > n / 2) return find_centroid(v, u, n);
}
return u;
}
void init_centroid(int u = 0, int p = -1, int w = 0) {
find_size(u);
int c = find_centroid(u, -1, siz[u]);
vis[c] = 1;
par[c] = p, W[c] = w;
// cout << c << " -> " << p << endl;
for(auto e : adj[c]) {
auto [v, wv] = e;
if (vis[v]) continue;
init_centroid(v, c, wv);
}
}
void Init(int N, int A[], int B[], int D[]) {
for(int i = 0; i < N-1; i++) {
adj[A[i]].push_back({B[i], D[i]});
adj[B[i]].push_back({A[i], D[i]});
}
for(int i = 0; i < N; i++) {
vis[i] = 0; par[i] = -1;
siz[i] = W[i] = 0;
dx[i] = dy[i] = INFL;
}
init_centroid();
}
ll Query(int S, int X[], int T, int Y[]) {
vector<int> alt;
for(int i = 0; i < S; i++) {
int u = X[i];
// cout << u << endl;
dx[u] = 0; alt.push_back(u);
while(par[u] != -1) {
// cout << "PARS: " << u << endl;
dx[par[u]] = min(dx[par[u]], dx[u] + W[u]);
alt.push_back(par[u]);
u = par[u];
}
// cout << "PARS: " << u << endl;
}
for(int i = 0; i < T; i++) {
int u = Y[i];
// cout << u << endl;
dy[u] = 0; alt.push_back(u);
while(par[u] != -1) {
// cout << "PART: " << u << endl;
dy[par[u]] = min(dy[par[u]], dy[u] + W[u]);
alt.push_back(par[u]);
u = par[u];
}
// cout << "PART: " << u << endl;
}
sort(begin(alt), end(alt)); alt.erase(unique(begin(alt), end(alt)), end(alt));
ll ans = INFL;
for(auto u : alt) {
// cout << u << " " << dx[u] << " + " << dy[u] << endl;
ans = min(ans, dx[u] + dy[u]);
dx[u] = dy[u] = INFL;
}
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... |