#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |