제출 #1294711

#제출 시각아이디문제언어결과실행 시간메모리
1294711harryleeeFactories (JOI14_factories)C++20
0 / 100
7 ms3128 KiB
#include<bits/stdc++.h> #include "factories.h" using namespace std; const int maxn = 5e5; int n, q, a[maxn], b[maxn], h[maxn], x[1000000], y[1000000], d[maxn], child[maxn], par[maxn], st[maxn][20]; bool del[maxn]; long long ans[maxn], dis[maxn]; vector<pair<int, long long>> adj[maxn + 1]; void DFS(int u, int p){ child[u] = 1; for (auto [v, w] : adj[u]) if (v != p && !del[v]){ DFS(v, u); child[u] += child[v]; } return; } int find_centroid(int u, int p, int num){ for (auto [v, w] : adj[u]) if (v != p && !del[v]){ if (child[v] > num / 2) return find_centroid(v, u, num); } return u; } void compute(int u, int p){ DFS(u, -1); int centroid = find_centroid(u, -1, child[u]); del[centroid] = true; par[centroid] = p; for (auto [v, w] : adj[centroid]) if (!del[v]) compute(v, centroid); return; } void DFS1(int u, int p){ for (auto [v, w] : adj[u]) if (v != p){ h[v] = h[u] + 1; dis[v] = dis[u] + w; st[v][0] = u; for (int i = 1; (1 << i) <= h[v] ; ++i){ st[v][i] = st[st[v][i - 1]][i - 1]; } DFS1(v, u); } return; } int lca(int u, int v){ if (h[u] > h[v]) swap(u, v); int k = h[v] - h[u]; for (int i = 0; i <= 19; ++i) if (k & (1 << i)) v = st[v][i]; if (u == v) return u; for (int i = 19; i >= 0; --i) if (st[u][i] != st[v][i]){ u = st[u][i]; v = st[v][i]; } return st[u][0]; } long long length(int u, int v){ return dis[u] + dis[v] - 2 * dis[lca(u, v)]; } void Init(int N, int A[], int B[], int D[]){ n = N; memset(del, false, sizeof(del)); fill(par, par + maxn, -1); for (int i = 0; i < n; ++i){ ans[i] = 1e18; } for (int i = 0; i < n - 1; ++i){ adj[A[i]].push_back({B[i], D[i]}); adj[B[i]].push_back({B[i], D[i]}); } compute(0, -1); DFS1(0, -1); return; } long long Query(int S, int X[], int T, int Y[]){ long long res = 1e18; for (int i = 0; i < T; ++i){ int p = Y[i]; while(p != -1){ ans[p] = min(ans[p], length(Y[i], p)); p = par[p]; } }; for (int i = 0; i < S; ++i){ int p = X[i]; while(p != -1){ res = min(res, ans[p] + length(X[i], p)); p = par[p]; } } for (int i = 0; i < T; ++i){ int p = Y[i]; while(p != -1){ ans[p] = 1e18; p = par[p]; } }; return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...