#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
const int MAXN = 5e5 + 5;
const int LOGN = 20;
const ll INF = 1e17;
vector<int> tree[MAXN];
vector<pair<int, int> > gr[MAXN];
//int par[MAXN][LOGN], lvl[MAXN];
//ll dist[MAXN];
int lvl[MAXN];
ll dist[MAXN][LOGN];
//unordered_map<int, ll> dist[MAXN];
bool mark[MAXN];
int sz[MAXN], cpar[MAXN], root;
ll ans[MAXN];
/*
void init(int u) {
for (int j = 1; j < LOGN; j++)
if (par[u][j - 1] != -1)
par[u][j] = par[par[u][j - 1]][j - 1];
for (auto v : gr[u])
if (v.fi != par[u][0]) {
dist[v.fi] = dist[u] + v.se;
par[v.fi][0] = u;
lvl[v.fi] = lvl[u] + 1;
init(v.fi);
}
}
*/
void dfs(int u, int p) {
sz[u] = 1;
for (auto v : gr[u])
if (v.fi != p && !mark[v.fi]) {
//dist[v.fi][who] = dist[u][who] + v.se;
dfs(v.fi, u);
sz[u] += sz[v.fi];
}
}
void proc(int u, int p, int dep) {
ll w = dist[u][dep];
mark[u] = true;
for (auto v : gr[u])
if (v.fi != p && !mark[v.fi]) {
dist[v.fi][dep] = w + v.se;
proc(v.fi, u, dep);
}
}
void init(int u) {
mark[u] = false;
//if (del) lvl[u] = -1;
for (auto v : tree[u]) {
//if (!del) lvl[v] = lvl[u] + 1;
init(v);
}
}
int decompose(int u, int p, const int n, int dep) {
int mx = -1, big = -1;
for (auto v : gr[u])
if (v.fi != p && !mark[v.fi] && sz[v.fi] > mx)
mx = sz[v.fi], big = v.fi;
//printf("i am at %d and big child is %d\n", u, big);
if (2 * mx <= n) {
mark[u] = true;
lvl[u] = dep;
//printf("START OF VISIT OF %d\n", u);
for (auto v : gr[u])
if (!mark[v.fi]) {
//dist[v.fi][u] = v.se;
dfs(v.fi, u);
int cent = decompose(v.fi, u, sz[v.fi], dep + 1);
cpar[cent] = u;
tree[u].pb(cent);
//lvl[cent] = 1;
//init(cent, false);
init(cent);
dist[v.fi][lvl[u]] = v.se;
proc(v.fi, u, lvl[u]);
//init(cent, true);
}
//printf("END OF VISIT OF %d\n", u);
return u;
} else {
return decompose(big, u, n, dep);
}
}
void Init(int N, int A[], int B[], int D[]) {
for (int i = 0; i < N - 1; i++) {
gr[A[i]].pb(mp(B[i], D[i]));
gr[B[i]].pb(mp(A[i], D[i]));
}
/*for (int i = 0; i < N; i++) {
dist[i].reserve(LOGN);
dist[i][i] = 0;
}*/
//memset(par, -1, sizeof par);
//init(0);
memset(cpar, -1, sizeof cpar);
dfs(0, -1);
//memset(lvl, -1, sizeof lvl);
//memset(dist, -1, sizeof dist);
root = decompose(0, -1, sz[0], 0);
fill(ans, ans + N + 1, INF);
/*init(root);
for (int i = 0; i < N; i++)
proc(i, i, cpar[i]);*/
/*printf("centroid is %d\n", root);
for (int u = 0; u < N; u++)
printf("cpar[%d] = %d\n", u, cpar[u]);*/
}
/*
unordered_map<int, int> memo[MAXN];
int LCA(int u, int v) {
if (lvl[u] > lvl[v]) swap(u, v);
if (memo[u].count(v))
return memo[u][v];
int &ret = memo[u][v];
for (int j = LOGN - 1; j >= 0; j--)
if (lvl[u] + (1 << j) <= lvl[v])
v = par[v][j];
if (u == v) return ret = u;
for (int j = LOGN - 1; j >= 0; j--)
if (par[u][j] != -1 && par[u][j] != par[v][j])
u = par[u][j], v = par[v][j];
return ret = par[u][0];
}
ll far(int u, int v) {
int l = LCA(u, v);
return dist[u] + dist[v] - dist[l] * 2LL;
}
*/
ll Query(int S, int X[], int T, int Y[]) {
for (int i = 0; i < S; i++) {
int u = X[i], c = lvl[X[i]];
while (u != -1) {
ans[u] = min(ans[u], dist[X[i]][c--]);
u = cpar[u];
}
}
ll res = INF;
for (int i = 0; i < T; i++) {
int u = Y[i], c = lvl[Y[i]];
while (u != -1) {
res = min(res, dist[Y[i]][c--] + ans[u]);
u = cpar[u];
}
}
for (int i = 0; i < S; i++) {
int u = X[i];
while (u != -1) {
ans[u] = INF;
u = cpar[u];
}
}
return res;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
136108 KB |
Output is correct |
2 |
Correct |
346 ms |
136372 KB |
Output is correct |
3 |
Correct |
409 ms |
136372 KB |
Output is correct |
4 |
Correct |
456 ms |
136372 KB |
Output is correct |
5 |
Correct |
413 ms |
136664 KB |
Output is correct |
6 |
Correct |
363 ms |
136408 KB |
Output is correct |
7 |
Correct |
406 ms |
136372 KB |
Output is correct |
8 |
Correct |
463 ms |
136372 KB |
Output is correct |
9 |
Correct |
489 ms |
136668 KB |
Output is correct |
10 |
Correct |
303 ms |
136408 KB |
Output is correct |
11 |
Correct |
483 ms |
136372 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
136108 KB |
Output is correct |
2 |
Correct |
2813 ms |
161848 KB |
Output is correct |
3 |
Correct |
4283 ms |
166940 KB |
Output is correct |
4 |
Correct |
829 ms |
160004 KB |
Output is correct |
5 |
Correct |
5176 ms |
200148 KB |
Output is correct |
6 |
Correct |
4309 ms |
166300 KB |
Output is correct |
7 |
Correct |
1303 ms |
142148 KB |
Output is correct |
8 |
Correct |
576 ms |
141360 KB |
Output is correct |
9 |
Correct |
1596 ms |
146004 KB |
Output is correct |
10 |
Correct |
1169 ms |
142000 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3156 ms |
161848 KB |
Output is correct |
2 |
Correct |
3073 ms |
161848 KB |
Output is correct |
3 |
Correct |
4389 ms |
165460 KB |
Output is correct |
4 |
Correct |
4969 ms |
166344 KB |
Output is correct |
5 |
Correct |
4646 ms |
166112 KB |
Output is correct |
6 |
Execution timed out |
6000 ms |
191488 KB |
Execution timed out |
7 |
Halted |
0 ms |
0 KB |
- |