#include <bits/stdc++.h>
#ifdef DEBUG
#include <debug.hpp>
#else
#define debug(...) 42
#endif
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
using namespace std;
const ll INF = 1e18;
vector<vector<pair<int, ll>>> gr;
vector<int> sz, used, act;
vector<ll> cls;
vector<vector<int>> cent;
vector<vector<ll>> dist;
int now = 0;
int find_sz(int v, int p) {
sz[v] = 1;
for (auto [to, w] : gr[v]) {
if (used[to] || to == p) continue;
sz[v] += find_sz(to, v);
}
return sz[v];
}
int centr(int v, int p, int cn) {
bool flag = 1;
while (flag) {
flag = 0;
for (auto [to, w] : gr[v]) {
if (used[to] || to == p) continue;
if (sz[to] > cn / 2) {
p = v;
v = to;
flag = 1;
break;
}
}
}
return v;
}
void dfs(int v, int c, int p = -1, ll d = 0) {
cent[v].push_back(c);
dist[v].push_back(d);
assert(cent[v].size() <= 25);
for (auto [to, w] : gr[v]) {
if (used[to] || to == p) continue;
dfs(to, c, v, d + w);
}
}
void Decomp(int v) {
int cn = find_sz(v, v);
int c = centr(v, v, cn);
used[c] = 1;
dfs(c, c);
for (auto [to, w] : gr[c]) {
if (used[to]) continue;
Decomp(to);
}
}
void Init(int N, int A[], int B[], int D[]) {
gr.assign(N, {});
used.assign(N, 0);
sz.assign(N, 0);
cent.assign(N, {});
dist.assign(N, {});
cls.assign(N, INF);
act.assign(N, 0);
for (int i = 0; i < N - 1; ++i) {
gr[A[i]].emplace_back(B[i], D[i]);
gr[B[i]].emplace_back(A[i], D[i]);
}
Decomp(0);
}
void Update(int v) {
for (size_t j = 0; j < cent[v].size(); ++j) {
int c = cent[v][j];
if (act[c] == now) {
cls[c] = min(cls[c], dist[v][j]);
} else {
cls[c] = dist[v][j];
act[c] = now;
}
}
}
ll GetMin(int v) {
ll res = INF;
for (size_t j = 0; j < cent[v].size(); ++j) {
int c = cent[v][j];
if (act[c] == now) {
res = min(res, dist[v][j] + cls[c]);
}
}
return res;
}
ll Query(int S, int X[], int T, int Y[]) {
// go through all X[i] centroids and update cls
for (int i = 0; i < S; ++i) {
Update(X[i]);
}
// go through all Y[i] centroids and update min(res, dist[Y[i]][c] + cls[c])
ll res = INF;
for (int i = 0; i < T; ++i) {
res = min(res, GetMin(Y[i]));
}
// Update actuality
++now;
return res;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
16984 KB |
Output is correct |
2 |
Correct |
229 ms |
30272 KB |
Output is correct |
3 |
Correct |
237 ms |
30584 KB |
Output is correct |
4 |
Correct |
253 ms |
30576 KB |
Output is correct |
5 |
Correct |
244 ms |
31104 KB |
Output is correct |
6 |
Correct |
156 ms |
31404 KB |
Output is correct |
7 |
Correct |
236 ms |
32176 KB |
Output is correct |
8 |
Correct |
282 ms |
32044 KB |
Output is correct |
9 |
Correct |
253 ms |
32584 KB |
Output is correct |
10 |
Correct |
158 ms |
31412 KB |
Output is correct |
11 |
Correct |
254 ms |
32212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
17040 KB |
Output is correct |
2 |
Correct |
2527 ms |
215016 KB |
Output is correct |
3 |
Correct |
3878 ms |
265912 KB |
Output is correct |
4 |
Correct |
964 ms |
141664 KB |
Output is correct |
5 |
Correct |
4492 ms |
340684 KB |
Output is correct |
6 |
Correct |
4086 ms |
268248 KB |
Output is correct |
7 |
Correct |
1004 ms |
72684 KB |
Output is correct |
8 |
Correct |
300 ms |
55892 KB |
Output is correct |
9 |
Correct |
967 ms |
83228 KB |
Output is correct |
10 |
Correct |
994 ms |
73332 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
16984 KB |
Output is correct |
2 |
Correct |
229 ms |
30272 KB |
Output is correct |
3 |
Correct |
237 ms |
30584 KB |
Output is correct |
4 |
Correct |
253 ms |
30576 KB |
Output is correct |
5 |
Correct |
244 ms |
31104 KB |
Output is correct |
6 |
Correct |
156 ms |
31404 KB |
Output is correct |
7 |
Correct |
236 ms |
32176 KB |
Output is correct |
8 |
Correct |
282 ms |
32044 KB |
Output is correct |
9 |
Correct |
253 ms |
32584 KB |
Output is correct |
10 |
Correct |
158 ms |
31412 KB |
Output is correct |
11 |
Correct |
254 ms |
32212 KB |
Output is correct |
12 |
Correct |
3 ms |
17040 KB |
Output is correct |
13 |
Correct |
2527 ms |
215016 KB |
Output is correct |
14 |
Correct |
3878 ms |
265912 KB |
Output is correct |
15 |
Correct |
964 ms |
141664 KB |
Output is correct |
16 |
Correct |
4492 ms |
340684 KB |
Output is correct |
17 |
Correct |
4086 ms |
268248 KB |
Output is correct |
18 |
Correct |
1004 ms |
72684 KB |
Output is correct |
19 |
Correct |
300 ms |
55892 KB |
Output is correct |
20 |
Correct |
967 ms |
83228 KB |
Output is correct |
21 |
Correct |
994 ms |
73332 KB |
Output is correct |
22 |
Correct |
2929 ms |
219252 KB |
Output is correct |
23 |
Correct |
3119 ms |
222348 KB |
Output is correct |
24 |
Correct |
4610 ms |
275276 KB |
Output is correct |
25 |
Correct |
4622 ms |
278020 KB |
Output is correct |
26 |
Correct |
4738 ms |
276424 KB |
Output is correct |
27 |
Correct |
5450 ms |
336232 KB |
Output is correct |
28 |
Correct |
1197 ms |
148288 KB |
Output is correct |
29 |
Correct |
4798 ms |
275448 KB |
Output is correct |
30 |
Correct |
4753 ms |
274416 KB |
Output is correct |
31 |
Correct |
4533 ms |
276120 KB |
Output is correct |
32 |
Correct |
1180 ms |
83660 KB |
Output is correct |
33 |
Correct |
377 ms |
55756 KB |
Output is correct |
34 |
Correct |
779 ms |
67288 KB |
Output is correct |
35 |
Correct |
755 ms |
67660 KB |
Output is correct |
36 |
Correct |
1024 ms |
71604 KB |
Output is correct |
37 |
Correct |
1006 ms |
71624 KB |
Output is correct |