#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <array>
#include <iomanip>
#include <queue>
#include <stack>
#include <numeric>
#include <cassert>
#include <cmath>
#include <random>
#include <ctime>
#include <chrono>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)x.size())
#define rep(i, a, b) for(int i = a; i < b; ++i)
template <typename T>
void remove_duplicates(vector<T> &v){
sort(all(v));
v.resize(unique(all(v)) - v.begin());
}
template <typename T> void chmin(T &a, T b){ a = (b < a) ? b : a; }
template <typename T> void chmax(T &a, T b){ a = (b > a) ? b : a; }
template<class T>
struct RMQ {
vector<vector<T>> jmp;
RMQ(){}
RMQ(const vector<T>& V) : jmp(1, V) {
for (int pw = 1, k = 1; pw * 2 <= sz(V); pw *= 2, ++k) {
jmp.emplace_back(sz(V) - pw * 2 + 1);
rep(j,0,sz(jmp[k]))
jmp[k][j] = min(jmp[k - 1][j], jmp[k - 1][j + pw]);
}
}
T query(int a, int b) {
// assert(a < b); // or return inf if a == b
int dep = 31 - __builtin_clz(b - a);
return min(jmp[dep][a], jmp[dep][b - (1 << dep)]);
}
};
struct LCA {
int T = 0;
vi time, path, ret;
RMQ<int> rmq;
LCA(){}
LCA(vector<vi>& C) : time(sz(C)), rmq((dfs(C,0,-1), ret)) {}
void dfs(vector<vi>& C, int v, int par) {
time[v] = T++;
for (int y : C[v]) if (y != par) {
path.push_back(v), ret.push_back(time[v]);
dfs(C, y, v);
}
}
int lca(int a, int b) {
if (a == b) return a;
tie(a, b) = minmax(time[a], time[b]);
return path[rmq.query(a, b)];
}
//dist(a,b){return depth[a] + depth[b] - 2*depth[lca(a,b)];}
} lca;
const int N = 5e5 + 3;
int n, sz[N];
vector<pii> adj[N];
bool vis[N];
int cen_par[N];
ll depth[N];
ll get_dist(int a, int b){
int l = lca.lca(a, b);
return depth[a] + depth[b] - 2 * depth[l];
}
void dfs_depth(int u, int par = -1){
for(auto [to, w]: adj[u]){
if(to == par) continue;
depth[to] = depth[u] + w;
dfs_depth(to, u);
}
}
void dfs_sz(int u, int par = -1){
sz[u] = 1;
for(auto [to, w]: adj[u]){
if(vis[to] || to == par) continue;
dfs_sz(to, u);
sz[u] += sz[to];
}
}
int find_centroid(int u, int sz_root, int par = -1){
for(auto [to, w]: adj[u]){
if(to == par || vis[to]) continue;
if(sz[to] >= sz_root / 2) return find_centroid(to, sz_root, u);
}
return u;
}
void decompose(int u, int par = -1){
dfs_sz(u);
int cen = find_centroid(u, sz[u]);
cen_par[cen] = par;
vis[cen] = true;
for(auto [to, w]: adj[cen]){
if(vis[to]) continue;
decompose(to, cen);
}
}
const ll INF = 1e18;
ll mn[N];
void Init(int _n, int *a, int *b, int *d){
n = _n;
vector<vi> adj2(n + 1);
for(int i = 0; i < n - 1; ++i){
adj[a[i]].push_back({b[i], d[i]});
adj[b[i]].push_back({a[i], d[i]});
adj2[a[i]].push_back(b[i]);
adj2[b[i]].push_back(a[i]);
}
lca = LCA(adj2);
decompose(0);
// for(int i = 0; i < n; ++i){
// cout << "anc of " << i << ": ";
// for(int x: anc[i])
// cout << x << " ";
// cout << endl;
// }
dfs_depth(0);
for(int i = 0; i < n; ++i)
mn[i] = INF;
}
ll Query(int s, int *x, int t, int *y){
if(s > t){
swap(s, t);
swap(x, y);
}
for(int i = 0; i < s; ++i){
int v = x[i];
int a = v;
while(a != -1){
chmin(mn[a], get_dist(a, v));
a = cen_par[a];
}
}
// cout << "x" << endl;
ll ans = INF;
for(int i = 0; i < t; ++i){
int v = y[i];
int a = v;
while(a != -1){
chmin(ans, mn[a] + get_dist(a, v));
a = cen_par[a];
}
}
for(int i = 0; i < s; ++i){
int v = x[i];
int a = v;
while(a != -1){
mn[a] = INF;
a = cen_par[a];
}
}
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12636 KB |
Output is correct |
2 |
Correct |
277 ms |
28404 KB |
Output is correct |
3 |
Correct |
350 ms |
28500 KB |
Output is correct |
4 |
Correct |
369 ms |
28496 KB |
Output is correct |
5 |
Correct |
409 ms |
28756 KB |
Output is correct |
6 |
Correct |
158 ms |
28500 KB |
Output is correct |
7 |
Correct |
341 ms |
28436 KB |
Output is correct |
8 |
Correct |
324 ms |
28756 KB |
Output is correct |
9 |
Correct |
405 ms |
28752 KB |
Output is correct |
10 |
Correct |
153 ms |
28616 KB |
Output is correct |
11 |
Correct |
338 ms |
28492 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
12376 KB |
Output is correct |
2 |
Correct |
1431 ms |
137248 KB |
Output is correct |
3 |
Correct |
1910 ms |
139364 KB |
Output is correct |
4 |
Correct |
560 ms |
139704 KB |
Output is correct |
5 |
Correct |
2725 ms |
167260 KB |
Output is correct |
6 |
Correct |
1976 ms |
140056 KB |
Output is correct |
7 |
Correct |
869 ms |
52184 KB |
Output is correct |
8 |
Correct |
254 ms |
52424 KB |
Output is correct |
9 |
Correct |
1079 ms |
55256 KB |
Output is correct |
10 |
Correct |
864 ms |
52424 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12636 KB |
Output is correct |
2 |
Correct |
277 ms |
28404 KB |
Output is correct |
3 |
Correct |
350 ms |
28500 KB |
Output is correct |
4 |
Correct |
369 ms |
28496 KB |
Output is correct |
5 |
Correct |
409 ms |
28756 KB |
Output is correct |
6 |
Correct |
158 ms |
28500 KB |
Output is correct |
7 |
Correct |
341 ms |
28436 KB |
Output is correct |
8 |
Correct |
324 ms |
28756 KB |
Output is correct |
9 |
Correct |
405 ms |
28752 KB |
Output is correct |
10 |
Correct |
153 ms |
28616 KB |
Output is correct |
11 |
Correct |
338 ms |
28492 KB |
Output is correct |
12 |
Correct |
7 ms |
12376 KB |
Output is correct |
13 |
Correct |
1431 ms |
137248 KB |
Output is correct |
14 |
Correct |
1910 ms |
139364 KB |
Output is correct |
15 |
Correct |
560 ms |
139704 KB |
Output is correct |
16 |
Correct |
2725 ms |
167260 KB |
Output is correct |
17 |
Correct |
1976 ms |
140056 KB |
Output is correct |
18 |
Correct |
869 ms |
52184 KB |
Output is correct |
19 |
Correct |
254 ms |
52424 KB |
Output is correct |
20 |
Correct |
1079 ms |
55256 KB |
Output is correct |
21 |
Correct |
864 ms |
52424 KB |
Output is correct |
22 |
Correct |
2008 ms |
144224 KB |
Output is correct |
23 |
Correct |
1936 ms |
145400 KB |
Output is correct |
24 |
Correct |
2508 ms |
146284 KB |
Output is correct |
25 |
Correct |
2496 ms |
148348 KB |
Output is correct |
26 |
Correct |
2593 ms |
147176 KB |
Output is correct |
27 |
Correct |
3423 ms |
168476 KB |
Output is correct |
28 |
Correct |
637 ms |
148312 KB |
Output is correct |
29 |
Correct |
2487 ms |
146740 KB |
Output is correct |
30 |
Correct |
2588 ms |
145972 KB |
Output is correct |
31 |
Correct |
2575 ms |
140884 KB |
Output is correct |
32 |
Correct |
1016 ms |
52372 KB |
Output is correct |
33 |
Correct |
243 ms |
48840 KB |
Output is correct |
34 |
Correct |
611 ms |
47200 KB |
Output is correct |
35 |
Correct |
623 ms |
47192 KB |
Output is correct |
36 |
Correct |
860 ms |
47632 KB |
Output is correct |
37 |
Correct |
822 ms |
47780 KB |
Output is correct |