Submission #1155638

#TimeUsernameProblemLanguageResultExecution timeMemory
1155638Hamed_GhaffariFactories (JOI14_factories)C++20
100 / 100
3163 ms247512 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...