#include <bits/stdc++.h>
#include "factories.h"
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
const int O = 2e6 + 5;
const int mod = 1e9 + 7; //998244353;
const long long inf = 1e16;
int pr[] = {167772161, 469762049, 754974721, 1045430273, 1051721729, 1053818881};
int n, q, Time, p[O], h[O], rp[O], in[O], child[O], f[22][O];
long long d[O], val[20][O];
vector <pair <int, int>> g[O];
pair <long long, int> dp[2][O];
bool del[O];
void init(int u, int par = -1){
in[u] = ++ Time; rp[Time] = u;
for (auto &to : g[u]){
int v = to.first;
int w = to.second;
if (v != par){
h[v] = h[u] + 1;
d[v] = d[u] + w;
init(v, u);
rp[++ Time] = u;
}
}
}
int Lca(int u, int v){
int l = min(in[u], in[v]);
int r = max(in[u], in[v]);
if (l == r) return u;
int len = log2(r - l + 1);
return h[f[len][l]] < h[f[len][r - (1 << len) + 1]] ? f[len][l] : f[len][r - (1 << len) + 1];
}
long long dist(int u, int v){
return d[u] + d[v] - 2 * d[Lca(u, v)];
}
void dfs_init(int u, int par = -1){
child[u] = 1;
for (auto &to : g[u]){
int v = to.first;
int w = to.second;
if (v != par && !del[v]){
dfs_init(v, u);
child[u] += child[v];
}
}
}
int centroid(int u, int par, int Nchild){
for (auto &to : g[u]){
int v = to.first;
if (v != par && !del[v] && child[v] * 2 > Nchild) return centroid(v, u, Nchild);
}
return u;
}
int dfs_centroid(int u){
dfs_init(u);
int root = centroid(u, -1, child[u]);
del[root] = 1;
for (auto &v : g[root]){
if (!del[v.first]){
int nxt = dfs_centroid(v.first);
p[nxt] = root;
//cout << root << " " << nxt << " " << x << endl;
}
}
return root;
}
void Init(int N, int A[], int B[], int D[]){
n = N;
for (int i = 0; i < n - 1; ++ i){
int u, v, w;
u = A[i]; v = B[i]; w = D[i];
g[u].push_back({v, w});
g[v].push_back({u, w});
}
memset(p, -1, sizeof(p));
init(0);
for (int i = 1; i <= Time; ++ i){
f[0][i] = rp[i];
}
for (int i = 1; i <= 21; ++ i){
for (int j = 1; j - 1 + (1 << i) <= Time; ++ j){
f[i][j] = h[f[i - 1][j]] < h[f[i - 1][j + (1 << (i - 1))]] ? f[i - 1][j] : f[i - 1][j + (1 << (i - 1))];
}
}
//cout << "deba" << endl;
dfs_centroid(0);
//cout << "deba" << endl;
for (int i = 0; i < n; ++ i){
int u = i, cnt = 0;
while (u != -1){
val[cnt ++][i] = dist(i, u);
u = p[u];
}
}
for (int i = 0; i < n; ++ i) dp[0][i] = dp[1][i] = {inf, -1};
return;
}
long long Query(int S, int X[], int T, int Y[]){
long long res = inf;
for (int i = 0; i < S; ++ i){
int u = X[i], cnt = 0;
pair <long long, int> cur = {0, -1};
while (u != -1){
cur.first = val[cnt ++][X[i]];
if (dp[0][u].first > cur.first){
pair <long long, int> x = dp[0][u];
dp[0][u] = cur;
if (cur.second != x.second) dp[1][u] = x;
}
else{
if (dp[1][u].first > cur.first && cur.second != dp[0][u].second){
dp[1][u] = cur;
}
//break;
}
cur.second = u;
u = p[u];
}
}
/*for (int i = 0; i < n; ++ i){
cout << i << " : " << dp[0][i].first << " " << dp[0][i].second << endl;
cout << i << " : " << dp[1][i].first << " " << dp[1][i].second << endl;
}*/
for (int i = 0; i < T; ++ i){
int u = Y[i], cnt = 0;
res = min(res, dp[0][u].first);
while (u != -1){
int par = p[u];
if (par != -1){
long long cur = val[++ cnt][Y[i]];
res = min(res, cur + (dp[0][par].second == u ? dp[1][par].first : dp[0][par].first));
}
u = par;
}
}
for (int i = 0; i < S; ++ i){
int u = X[i];
while (u != -1){
dp[0][u] = dp[1][u] = {inf, -1};
u = p[u];
}
}
return res;
}
/*main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> q;
int A[1000], B[1000], D[1000];
for (int i = 0; i < n - 1; ++ i){
cin >> A[i] >> B[i] >> D[i];
}
Init(n, A, B, D);
//cout << Time << " " << Lca(2, 4) << endl;
for (int i = 1; i <= q; ++ i){
int S, T;
cin >> S >> T;
int X[1000], Y[1000];
for (int j = 0; j < S; ++ j){
int x; cin >> x;
X[j] = x;
}
for (int j = 0; j < T; ++ j){
int x; cin >> x;
Y[j] = x;
}
cout << "debug " << i << endl;
cout << Query(S, X, T, Y) << "\n";
cout << "debug " << i << endl << endl;
}
}*/
/***
7 1
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
2 2
0 2
5 4
***/
Compilation message
factories.cpp: In function 'void dfs_init(int, int)':
factories.cpp:50:13: warning: unused variable 'w' [-Wunused-variable]
50 | int w = to.second;
| ^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
27 ms |
55644 KB |
Output is correct |
2 |
Correct |
240 ms |
74064 KB |
Output is correct |
3 |
Correct |
268 ms |
74352 KB |
Output is correct |
4 |
Correct |
248 ms |
74320 KB |
Output is correct |
5 |
Correct |
283 ms |
74576 KB |
Output is correct |
6 |
Correct |
141 ms |
73808 KB |
Output is correct |
7 |
Correct |
241 ms |
74320 KB |
Output is correct |
8 |
Correct |
254 ms |
74320 KB |
Output is correct |
9 |
Correct |
312 ms |
74704 KB |
Output is correct |
10 |
Correct |
135 ms |
73808 KB |
Output is correct |
11 |
Correct |
270 ms |
74364 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
23 ms |
55432 KB |
Output is correct |
2 |
Correct |
1193 ms |
267924 KB |
Output is correct |
3 |
Correct |
1686 ms |
283852 KB |
Output is correct |
4 |
Correct |
387 ms |
215748 KB |
Output is correct |
5 |
Correct |
2410 ms |
312912 KB |
Output is correct |
6 |
Correct |
1735 ms |
285776 KB |
Output is correct |
7 |
Correct |
613 ms |
115020 KB |
Output is correct |
8 |
Correct |
262 ms |
103876 KB |
Output is correct |
9 |
Correct |
773 ms |
119376 KB |
Output is correct |
10 |
Correct |
712 ms |
116340 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
27 ms |
55644 KB |
Output is correct |
2 |
Correct |
240 ms |
74064 KB |
Output is correct |
3 |
Correct |
268 ms |
74352 KB |
Output is correct |
4 |
Correct |
248 ms |
74320 KB |
Output is correct |
5 |
Correct |
283 ms |
74576 KB |
Output is correct |
6 |
Correct |
141 ms |
73808 KB |
Output is correct |
7 |
Correct |
241 ms |
74320 KB |
Output is correct |
8 |
Correct |
254 ms |
74320 KB |
Output is correct |
9 |
Correct |
312 ms |
74704 KB |
Output is correct |
10 |
Correct |
135 ms |
73808 KB |
Output is correct |
11 |
Correct |
270 ms |
74364 KB |
Output is correct |
12 |
Correct |
23 ms |
55432 KB |
Output is correct |
13 |
Correct |
1193 ms |
267924 KB |
Output is correct |
14 |
Correct |
1686 ms |
283852 KB |
Output is correct |
15 |
Correct |
387 ms |
215748 KB |
Output is correct |
16 |
Correct |
2410 ms |
312912 KB |
Output is correct |
17 |
Correct |
1735 ms |
285776 KB |
Output is correct |
18 |
Correct |
613 ms |
115020 KB |
Output is correct |
19 |
Correct |
262 ms |
103876 KB |
Output is correct |
20 |
Correct |
773 ms |
119376 KB |
Output is correct |
21 |
Correct |
712 ms |
116340 KB |
Output is correct |
22 |
Correct |
1619 ms |
274772 KB |
Output is correct |
23 |
Correct |
1622 ms |
279508 KB |
Output is correct |
24 |
Correct |
2105 ms |
293716 KB |
Output is correct |
25 |
Correct |
2295 ms |
297736 KB |
Output is correct |
26 |
Correct |
2360 ms |
294068 KB |
Output is correct |
27 |
Correct |
2753 ms |
317548 KB |
Output is correct |
28 |
Correct |
463 ms |
228068 KB |
Output is correct |
29 |
Correct |
2041 ms |
293644 KB |
Output is correct |
30 |
Correct |
2245 ms |
292952 KB |
Output is correct |
31 |
Correct |
2164 ms |
293716 KB |
Output is correct |
32 |
Correct |
801 ms |
121920 KB |
Output is correct |
33 |
Correct |
229 ms |
105652 KB |
Output is correct |
34 |
Correct |
454 ms |
111444 KB |
Output is correct |
35 |
Correct |
477 ms |
111344 KB |
Output is correct |
36 |
Correct |
685 ms |
114516 KB |
Output is correct |
37 |
Correct |
698 ms |
114728 KB |
Output is correct |