제출 #1272425

#제출 시각아이디문제언어결과실행 시간메모리
1272425KALARRY공장들 (JOI14_factories)C++20
0 / 100
3 ms568 KiB
//chockolateman #include<bits/stdc++.h> // #include "factories.h" using namespace std; const long long INF = 1e15; int s[500005],col[500005][21],anc[500005][21],par_c[500005],my_d[500005],timer; long long ans[500005]; vector<pair<int,int>> adj[500005]; bool is_removed[500005]; vector<long long> dist[500005]; void dfs1(int v,int p,int d) { s[v] = 1; col[v][d] = ++timer; for(auto e : adj[v]) { int u = e.first; if(!is_removed[u] && u != p) { dfs1(u,v,d); s[v] += s[u]; } } } int centroid(int v,int p, int n) { for(auto e : adj[v]) { int u = e.first; if(!is_removed[u] && u != p && 2*s[u] > n) return centroid(u,v,n); } return v; } void dfs2(int v,int p,int root) { anc[v][my_d[root]] = root; for(auto e : adj[v]) { int u = e.first; int w = e.second; if(!is_removed[u] && u != p) { dist[root][col[u][my_d[root]]] = dist[root][col[v][my_d[root]]] + w; dfs2(u,v,root); } } } void build(int v,int p,int d) { timer = 0; dfs1(v,v,d); int n = s[v]; int c = centroid(v,v,n); vector<int> temp; for(int i = 0 ; i <= timer ; i++) dist[c].push_back(0ll); dfs2(c,c,c); ans[c] = INF; if(p == -1) p = c; par_c[c] = p; my_d[c] = d; is_removed[c] = true; for(auto e : adj[c]) { int u = e.first; if(!is_removed[u]) build(u,c,d+1); } } void update(int v) { ans[v] = 0; int pos = v; while(par_c[pos] != pos) { pos = par_c[pos]; ans[pos] = min(ans[pos],dist[pos][col[v][my_d[pos]]]); } } long long query(int v) { long long ret = ans[v]; int pos = v; while(par_c[pos] != pos) { pos = par_c[pos]; ret = min(ret,ans[pos] + dist[pos][col[v][my_d[pos]]]); } return ret; } void undo(int v) { ans[v] = INF; int pos = v; while(par_c[pos] != pos) { pos = par_c[pos]; ans[pos] = INF; } } void Init(int N, int A[], int B[], int D[]) { for(int a,b,w,i = 0 ; i < N-1 ; i++) { a = A[i]+1; b = B[i]+1; w = D[i]; adj[a].push_back({b,w}); adj[b].push_back({a,w}); } } long long Query(int S, int X[], int T, int Y[]) { long long ret = INF; for(int i = 0 ; i < T ; i++) update(Y[i]+1); for(int i = 0 ; i < S ; i++) ret = min(ret,query(X[i]+1)); for(int i = 0 ; i < T ; i++) undo(Y[i]+1); return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...