#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("Ofast")
#define F first
// #define S second
#define vi vector<int>
#define vvi vector<vi>
#define pi pair<int, int>
#define vpi vector<pi>
#define vb vector<bool>
#define vvb vector<vb>
#define pb push_back
#define ppb pop_back
#define read(a) for(auto &x:a) cin >> x;
#define print(a) for(auto x:a) cout << x << " "; cout << "\n";
#define vc vector<char>
#define vvc vector<vc>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define double ld
// #define int long long
const long long INF = 4e18;
const int MN = 5e5+1;
int n;
vpi adj[MN];
int st[2*MN][21];
long long saved[MN][21];
long long d[MN], dc[MN], sub[MN], par[MN], best[MN], vis[MN], tin[MN], eul[2*MN];
bool del[MN];
int tt = 0;
int lg2(int x){
return 31-__builtin_clz(x);
}
int cmp(int a, int b){
return (d[a] < d[b] ? a : b);
}
int lca(int a, int b){
if(tin[a] > tin[b]) swap(a, b);
int len = tin[b]-tin[a]+1, lg = lg2(len);
return cmp(st[tin[a]][lg], st[tin[b]-(1LL<<lg)+1][lg]);
}
long long dist(int a, int b){
return dc[a]+dc[b]-2*dc[lca(a, b)];
}
void build(){
int time = 0;
function<void(int, int)> dfs0 = [&](int s, int e){
tin[s] = time;
eul[time++] = s;
for(auto [u, c]:adj[s]){
if(u == e) continue;
d[u] = d[s]+1;
dc[u] = dc[s]+c;
dfs0(u, s);
eul[time++] = s;
}
};
dfs0(1, 0);
for(int i=0; i<2*n-1; i++) st[i][0] = eul[i];
for(int j=1; j<=20; j++)
for(int i=0; i+(1LL<<j)-1<2*n-1; i++)
st[i][j] = cmp(st[i][j-1], st[i+(1LL<<(j-1))][j-1]);
//START_CENTROID
function<void(int, int)> dfs_sub = [&](int s, int e){
sub[s] = 1;
for(auto [u, c]:adj[s]){
if(u == e || del[u]) continue;
dfs_sub(u, s);
sub[s] += sub[u];
}
};
function<int(int, int, int)> centroid = [&](int s, int e, int sz){
for(auto [u, c]:adj[s])
if(u != e && !del[u] && sub[u] > sz/2) return centroid(u, s, sz);
return s;
};
function<void(int, int)> decompose = [&](int s, int p){
dfs_sub(s, 0);
int C = centroid(s, 0, sub[s]);
par[C] = p;
del[C] = 1;
for(auto [u, c]:adj[C])
if(!del[u]) decompose(u, C);
};
decompose(1, -1);
//END_CENTROID
}
void Init(int N, int A[], int B[], int D[]){
n = N;
for(int i=0; i<n-1; i++){
adj[A[i]+1].pb({B[i]+1, D[i]});
adj[B[i]+1].pb({A[i]+1, D[i]});
}
for(int i=0; i<MN; i++)
for(int j=0; j<=20; j++)
saved[i][j] = -1;
build();
}
long long Query(int S, int X[], int T, int Y[]){
tt++;
long long ans = INF;
for(int i=0; i<T; i++){
Y[i]++;
int curr = Y[i], c = 0;
while(curr != -1){
if(vis[curr] < tt){
vis[curr] = tt;
best[curr] = INF;
}
if(saved[Y[i]][c] == -1) saved[Y[i]][c] = dist(curr, Y[i]);
best[curr] = min(best[curr], saved[Y[i]][c]);
curr = par[curr];
c++;
}
}
for(int i=0; i<S; i++){
X[i]++;
int curr = X[i], c = 0;
while(curr != -1){
if(vis[curr] < tt){
vis[curr] = tt;
best[curr] = INF;
}
if(saved[X[i]][c] == -1) saved[X[i]][c] = dist(curr, X[i]);
ans = min(ans, best[curr]+saved[X[i]][c]);
curr = par[curr];
c++;
}
}
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
94668 KB |
Output is correct |
2 |
Correct |
268 ms |
103628 KB |
Output is correct |
3 |
Correct |
288 ms |
103692 KB |
Output is correct |
4 |
Correct |
283 ms |
103728 KB |
Output is correct |
5 |
Correct |
298 ms |
104104 KB |
Output is correct |
6 |
Correct |
202 ms |
103660 KB |
Output is correct |
7 |
Correct |
283 ms |
103664 KB |
Output is correct |
8 |
Correct |
303 ms |
103736 KB |
Output is correct |
9 |
Correct |
299 ms |
104112 KB |
Output is correct |
10 |
Correct |
202 ms |
103660 KB |
Output is correct |
11 |
Correct |
294 ms |
103784 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
94448 KB |
Output is correct |
2 |
Correct |
1903 ms |
243756 KB |
Output is correct |
3 |
Correct |
2564 ms |
248008 KB |
Output is correct |
4 |
Correct |
831 ms |
244320 KB |
Output is correct |
5 |
Correct |
3680 ms |
287968 KB |
Output is correct |
6 |
Correct |
2820 ms |
249004 KB |
Output is correct |
7 |
Correct |
760 ms |
133280 KB |
Output is correct |
8 |
Correct |
403 ms |
133316 KB |
Output is correct |
9 |
Correct |
876 ms |
138444 KB |
Output is correct |
10 |
Correct |
773 ms |
134332 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
94668 KB |
Output is correct |
2 |
Correct |
268 ms |
103628 KB |
Output is correct |
3 |
Correct |
288 ms |
103692 KB |
Output is correct |
4 |
Correct |
283 ms |
103728 KB |
Output is correct |
5 |
Correct |
298 ms |
104104 KB |
Output is correct |
6 |
Correct |
202 ms |
103660 KB |
Output is correct |
7 |
Correct |
283 ms |
103664 KB |
Output is correct |
8 |
Correct |
303 ms |
103736 KB |
Output is correct |
9 |
Correct |
299 ms |
104112 KB |
Output is correct |
10 |
Correct |
202 ms |
103660 KB |
Output is correct |
11 |
Correct |
294 ms |
103784 KB |
Output is correct |
12 |
Correct |
36 ms |
94448 KB |
Output is correct |
13 |
Correct |
1903 ms |
243756 KB |
Output is correct |
14 |
Correct |
2564 ms |
248008 KB |
Output is correct |
15 |
Correct |
831 ms |
244320 KB |
Output is correct |
16 |
Correct |
3680 ms |
287968 KB |
Output is correct |
17 |
Correct |
2820 ms |
249004 KB |
Output is correct |
18 |
Correct |
760 ms |
133280 KB |
Output is correct |
19 |
Correct |
403 ms |
133316 KB |
Output is correct |
20 |
Correct |
876 ms |
138444 KB |
Output is correct |
21 |
Correct |
773 ms |
134332 KB |
Output is correct |
22 |
Correct |
2238 ms |
245416 KB |
Output is correct |
23 |
Correct |
2330 ms |
247788 KB |
Output is correct |
24 |
Correct |
3368 ms |
249232 KB |
Output is correct |
25 |
Correct |
3802 ms |
252960 KB |
Output is correct |
26 |
Correct |
3685 ms |
249520 KB |
Output is correct |
27 |
Correct |
4489 ms |
281676 KB |
Output is correct |
28 |
Correct |
1126 ms |
248324 KB |
Output is correct |
29 |
Correct |
3857 ms |
249004 KB |
Output is correct |
30 |
Correct |
3928 ms |
248228 KB |
Output is correct |
31 |
Correct |
4295 ms |
248988 KB |
Output is correct |
32 |
Correct |
1106 ms |
142948 KB |
Output is correct |
33 |
Correct |
443 ms |
136784 KB |
Output is correct |
34 |
Correct |
718 ms |
133824 KB |
Output is correct |
35 |
Correct |
792 ms |
133820 KB |
Output is correct |
36 |
Correct |
889 ms |
134960 KB |
Output is correct |
37 |
Correct |
880 ms |
134740 KB |
Output is correct |