제출 #451927

#제출 시각아이디문제언어결과실행 시간메모리
451927MilosMilutinovic공장들 (JOI14_factories)C++14
0 / 100
8082 ms141180 KiB
/** * author: milos * created: 03.08.2021 15:01:08 **/ #include <bits/stdc++.h> using namespace std; const int N = 5e5 + 5; const int LOG = 25; vector<pair<int, int>> g[N]; int par[N][LOG], dep[N]; long long sum[N]; void Dfs(int u, int p) { par[u][0] = p; for (int i = 1; i < LOG; i++) { par[u][i] = par[par[u][i - 1]][i - 1]; } for (auto v : g[u]) { if (v.first != p) { dep[v.first] = dep[u] + 1; sum[v.first] = sum[u] + v.second; Dfs(v.first, u); } } } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); for (int i = LOG - 1; i >= 0; i--) { if (dep[par[u][i]] >= dep[v]) { u = par[u][i]; } } for (int i = LOG - 1; i >= 0; i--) { if (par[u][i] != par[v][i]) { u = par[u][i]; v = par[v][i]; } } return u == v ? u : par[u][0]; } long long Dist(int u, int v) { return sum[u] + sum[v] - 2 * sum[lca(u, v)]; } void Init(int N, int A[], int B[], int D[]) { for (int i = 0; i < N - 1; i++) { g[A[i] + 1].emplace_back(B[i] + 1, D[i]); g[B[i] + 1].emplace_back(A[i] + 1, D[i]); } Dfs(1, 0); } long long Query(int S, int X[], int T, int Y[]) { long long ans = 1e18; for (int i = 0; i < S; i++) { for (int j = 0; j < T; j++) { ans = min(ans, Dist(X[i] + 1, Y[j] + 1)); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...