제출 #1253961

#제출 시각아이디문제언어결과실행 시간메모리
1253961faricaFactories (JOI14_factories)C++20
100 / 100
4967 ms361452 KiB
#include<bits/stdc++.h> #include "factories.h" using namespace std; using vi = vector<int>; using pi = pair<int,int>; using ll = long long; vector<vector<pi>>adjL; vector<vector<pair<ll,ll>>>ancestors; vi sz; vector<bool>is_removed; int get_sz(int pos, int prev = -1) { sz[pos] = 1; for(pi adj: adjL[pos]) { if(adj.first == prev or is_removed[adj.first]) continue; sz[pos] += get_sz(adj.first, pos); } return sz[pos]; } int get_centroid(int pos, int n, int prev = -1) { for(pi adj: adjL[pos]) { if(adj.first == prev or is_removed[adj.first]) continue; if(sz[adj.first]*2 > n) return get_centroid(adj.first, n, pos); } return pos; } void get_dists(int pos, int centroid, int prev, ll cur_dist) { for(pi adj: adjL[pos]) { if(adj.first == prev or is_removed[adj.first]) continue; get_dists(adj.first, centroid, pos, cur_dist + adj.second); } ancestors[pos].push_back({centroid, cur_dist}); } void build(int pos = 0) { int centroid = get_centroid(pos, get_sz(pos)); for(pi adj: adjL[centroid]) { if(is_removed[adj.first]) continue; get_dists(adj.first, centroid, centroid, adj.second); } is_removed[centroid] = 1; for(pi adj: adjL[centroid]) { if(is_removed[adj.first]) continue; build(adj.first); } } void Init(int N, int A[], int B[], int D[]) { adjL.assign(N, vector<pi>()); is_removed.assign(N, 0); ancestors.assign(N, vector<pair<ll,ll>>()); sz.assign(N, 0); for(int i=0; i<N-1; ++i) { adjL[A[i]].push_back({B[i], D[i]}); adjL[B[i]].push_back({A[i], D[i]}); } build(); } const ll MXVAL = 1e18; const int MX_N = 5e5 + 5; priority_queue<pair<ll,ll>>pq[MX_N]; int q_cnt; long long Query(int S, int X[], int T, int Y[]) { for(int i=0; i<S; ++i) { while(!pq[X[i]].empty() && pq[X[i]].top().first != q_cnt) pq[X[i]].pop(); pq[X[i]].push({q_cnt, 0}); for(auto &[ancestor, dist]: ancestors[X[i]]) { while(!pq[ancestor].empty() && pq[ancestor].top().first != q_cnt) pq[ancestor].pop(); pq[ancestor].push({q_cnt, -dist}); } } ll ans = MXVAL; for(int i=0; i<T; ++i) { while(!pq[Y[i]].empty()) { pair<ll,ll> cur = pq[Y[i]].top(); cur.second *= -1; if(cur.first != q_cnt) { pq[Y[i]].pop(); continue; } ans = min(ans, cur.second); break; } for(auto &[ancestor, dist]: ancestors[Y[i]]) { while(!pq[ancestor].empty()) { pair<ll,ll> cur = pq[ancestor].top(); cur.second *= -1; if(cur.first != q_cnt) { pq[ancestor].pop(); continue; } ans = min(ans, dist + cur.second); break; } } } ++q_cnt; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...