제출 #29226

#제출 시각아이디문제언어결과실행 시간메모리
29226ruhanhabib39공장들 (JOI14_factories)C++11
15 / 100
6000 ms205752 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 5e5; const int MAXLG = 20; const long long INF = 1e18; int N; vector<pair<int,int>> G[MAXN + 10]; int cc[MAXN + 10]; int level[MAXN + 10]; long long dis[MAXLG + 10][MAXN + 10]; bool done[MAXN + 10]; int par[MAXN + 10]; void dfs0(int u, int p) { cc[u] = 1; for(auto e : G[u]) { int v = e.first; if(v == p || done[v]) continue; dfs0(v, u); cc[u] += cc[v]; } } void dfs(int u, int p, long long ds) { // cerr << u << " " << p << " " << ds << "\n"; dis[++level[u]][u] = ds; // cerr << "dis[" << level[u] << "][" << u << "] = " << dis[level[u]][u] << "\n"; for(auto e : G[u]) { int v, d; tie(v, d) = e; if(v == p || done[v]) continue; dfs(v, u, ds + d); } } int cnt; int centroid(int u, int p) { for(auto e : G[u]) { int v = e.first; if(v == p || done[v]) continue; if(cc[v] > cnt/2) return centroid(v, u); } return u; } void decomp(int u, int p) { dfs0(u, -1); cnt = cc[u]; u = centroid(u, -1); dfs(u, -1, 0); // cerr << "centroid = " << u << "\n"; par[u] = p; done[u] = true; for(auto e : G[u]) { int v = e.first; if(done[v]) continue; decomp(v, u); } } long long mn[MAXN + 10]; void Init(int N_, int A[], int B[], int D[]) { N = N_; for(int i = 0; i < N-1; i++) { G[A[i]].emplace_back(B[i], D[i]); G[B[i]].emplace_back(A[i], D[i]); } decomp(0, -1); std::fill(mn, mn + MAXN + 1, INF); } long long Query(int S, int X[], int T, int Y[]) { // cerr << "\n\n"; for(int i = 0; i < S; i++) { int u = X[i]; // cerr << "Xu = " << u << "\n"; for(int j = level[u]; j > 0; j--) { mn[u] = min(mn[u], dis[j][X[i]]); // cerr << "mn[" << u << "] = " << mn[u] << "\n"; u = par[u]; } } long long res = INF; for(int i = 0; i < T; i++) { int u = Y[i]; for(int j = level[u]; j > 0; j--) { res = min(res, mn[u] + dis[j][Y[i]]); u = par[u]; } } for(int i = 0; i < S; i++) { int u = X[i]; for(int j = level[u]; j > 0; j--) { mn[u] = INF; u = par[u]; } } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...