제출 #1309587

#제출 시각아이디문제언어결과실행 시간메모리
1309587hssaan_arif공장들 (JOI14_factories)C++20
33 / 100
8098 ms184612 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; #define endl "\n" #define pb push_back #define ll long long #define fi first #define se second const ll N = 5e5 + 5, M = 1e9 + 7, LG = 20; ll n , A[N] , sz[N] , P[N] , u , v , sp[N][LG] , Dep[N] , m , H[N] , B[N] ; int Ne , Q , L[N] , R[N] , D[N] , S , T , X[N] , Y[N]; vector<pair<ll,ll>> lis[N]; vector<int> used; bool dead[N]; void dfs(ll v , ll par , ll wi){ Dep[v] = Dep[par] + wi; H[v] = H[par] + 1; sp[v][0] = par; for (auto u : lis[v]){ if (u.fi == par) continue; dfs(u.fi , v , u.se); } } void pre_dfs(ll v , ll par){ sz[v] = 1; for (auto u : lis[v]){ if (u.fi == par || dead[u.fi]) continue; pre_dfs(u.fi , v); sz[v] += sz[u.fi]; } } ll ce(ll v , ll par , ll root){ for (auto u : lis[v]){ if (u.fi != par && !dead[u.fi] && 2 * sz[u.fi] > sz[root]) return ce(u.fi , v , root); } return v; } void get(ll v , ll par){ pre_dfs(v , par); ll c = ce(v , par , v); P[c] = par; dead[c] = 1; for (auto u : lis[c]){ if (!dead[u.fi]) get(u.fi , c); } } ll dist(ll u , ll v){ if (H[v] > H[u]){ swap(u , v); } ll dif = H[u] - H[v] , u1 = u , v1 = v; for (ll i=LG-1 ; i>=0 ; i--){ if ((1<<i) & dif){ u = sp[u][i]; } } if (u == v){ return Dep[u1] - Dep[v1]; } for (ll i=LG-1 ; i>=0 ; i--){ if (sp[u][i] != sp[v][i]){ u = sp[u][i]; v = sp[v][i]; } } return Dep[u1] + Dep[v1] - 2 * Dep[sp[u][0]]; } void upd(ll v , ll par){ while(par != -1){ used.pb(par); A[par] = min(A[par] , dist(v , par)); par = P[par]; } } void upd1(ll v , ll par){ while(par != -1){ used.pb(par); B[par] = min(B[par] , dist(v , par)); par = P[par]; } } ll cal(ll v , ll par){ ll ans = 1e18; while(par != -1){ ans = min(ans , A[par] + B[par]); par = P[par]; } return ans; } void Init(int N, int L[], int R[], int D[]) { n = N; for (int i=1 ; i<=N ; i++){ lis[i].clear(); } for (ll i=0 ; i<n-1 ; i++){ u = L[i]+1; v = R[i]+1; m = D[i]; lis[u].pb({v,m}); lis[v].pb({u,m}); } for (ll i=0 ; i<=N ; i++) A[i] = B[i] = 1e18; dfs(1 , 0 , 0); for (ll j=1 ; j<LG ; j++){ for (ll i=1 ; i<=n ; i++){ sp[i][j] = sp[sp[i][j-1]][j-1]; } } get(1 , -1); } long long Query(int S, int X[], int T, int Y[]) { for (ll i=0 ; i<S ; i++){ upd(X[i]+1 ,X[i]+1); } for (ll i=0 ; i<T ; i++){ upd1(Y[i]+1 ,Y[i]+1); } ll bs = 1e18; for (ll i=0 ; i<T ; i++){ bs = min(bs , cal(Y[i]+1 ,Y[i]+1)); } for (int i : used){ A[i] = B[i] = 1e18; } used.clear(); return bs; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...