Submission #959622

#TimeUsernameProblemLanguageResultExecution timeMemory
959622dong_gasFactories (JOI14_factories)C++17
100 / 100
3140 ms197016 KiB
#include <bits/extc++.h> #include "factories.h" #define all(v) v.begin(), v.end() #define zip(v) sort(all(v)), v.erase(unique(all(v)), v.end()) using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pint; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; int n, q; int sz[500050], use[500050], cent_papa[500050], dep[500050]; vector<pint> adj[500050]; ll m[500050], lv_dist[500050][23]; int get_size(int u, int p=0) { sz[u]=1; for(auto& [v, w]:adj[u]) { if(use[v] || p==v) continue; sz[u]+=get_size(v,u); } return sz[u]; } int get_cent(int u, int p, int cnt) { for(auto& [v, w]:adj[u]) { if(use[v] || v==p) continue; if(sz[v]>cnt/2) return get_cent(v,u,cnt); } return u; } void go(int u, int p, int lv) { for(auto& [v,w]:adj[u]) { if(use[v] || v==p) continue; lv_dist[v][lv]=lv_dist[u][lv]+w; go(v,u,lv); } } void dnc(int u, int p=0, int lv=0) {//p는 이전 cent int cent=get_cent(u,p,get_size(u,p)); cent_papa[cent]=p; use[cent]=1; dep[cent]=lv; go(cent, 0, lv); for(auto& [v, w]:adj[cent]) if(!use[v]) dnc(v,cent,lv+1); } void update(int u) { int now=u; do { m[now]=min(m[now],lv_dist[u][dep[now]]); now=cent_papa[now]; } while(now); } void downdate(int u) { int now=u; do { m[now]=1e18; now=cent_papa[now]; } while(now); } ll query(int u) { int now=u; ll ret=1e18; do { ret=min(ret, m[now] + lv_dist[u][dep[now]]); now=cent_papa[now]; } while(now); return (ret<1e18) ? ret : -1; } void Init(int N, int A[], int B[], int D[]) { n=N; for(int i=0;i<n-1;i++) { adj[A[i]+1].emplace_back(B[i]+1,D[i]); adj[B[i]+1].emplace_back(A[i]+1,D[i]); } dnc(1); fill(m+1,m+n+1,1e18); } long long Query(int S, int X[], int T, int Y[]) { ll ret=1e18; for(int i=0;i<S;i++) update(X[i]+1); for(int i=0;i<T;i++) ret=min(ret,query(Y[i]+1)); for(int i=0;i<S;i++) downdate(X[i]+1); return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...