This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int O = 5e5 + 5;
const int inf = 1e9;
int n, q, c[O], h[O], E[O], W[O], deg[O], p[18][O], f[18][O];
vector <int> g[O];
bool sub2 = true;
void init(int u, int par = 0){
for (int i : g[u]){
int v = u ^ E[i];
int w = W[i];
if (v != par){
h[v] = h[u] + 1;
c[h[u]] += w;
c[h[v]] += c[h[u]];
init(v, u);
}
}
}
void dfs(int u, int par = 0){
for (int i : g[u]){
int v = u ^ E[i];
int w = W[i];
if (v != par){
h[v] = h[u] + 1;
p[0][v] = u;
f[0][v] = w;
dfs(v, u);
}
}
}
void BuildLca(){
memset(p, -1, sizeof(p));
dfs(1);
for (int i = 1; i <= 17; ++ i){
for (int j = 1; j <= n; ++ j){
if (p[i - 1][j] != -1){
p[i][j] = p[i - 1][p[i - 1][j]];
f[i][j] = f[i - 1][j] + f[i - 1][p[i - 1][j]];
}
}
}
}
int Lca(int u, int v){
if (h[u] < h[v]) swap(u, v);
for (int i = 17; i >= 0; -- i){
if (h[u] - (1 << i) >= h[v]) u = p[i][u];
}
if (u == v) return u;
for (int i = 17; i >= 0; -- i){
if (p[i][u] != p[i][v]){
u = p[i][u];
v = p[i][v];
}
}
return p[0][u];
}
int Jump(int u, int d){
int res = 0;
for (int i = 17; i >= 0; -- i){
if (d >> i & 1){
res += f[i][u];
u = p[i][u];
}
}
return res;
}
main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i < n; ++ i){
int u, v, w; cin >> u >> v >> w;
u += 1; v += 1;
g[u].push_back(i);
g[v].push_back(i);
E[i] = u ^ v;
W[i] = w;
deg[u] += 1;
deg[v] += 1;
sub2 &= deg[u] <= 2;
sub2 &= deg[v] <= 2;
}
if (sub2){
int sta;
for (int i = 1; i <= n; ++ i)
if (deg[i] == 1) sta = i;
h[sta] = 1;
init(sta);
cin >> q;
for (int i = 1; i <= q; ++ i){
int node[5];
for (int j = 0; j < 5; ++ j) cin >> node[j], node[j] += 1;
int Min = inf, Max = -inf;
for (int j = 0; j < 5; ++ j){
Min = min(Min, h[node[j]]);
Max = max(Max, h[node[j]]);
}
cout << c[Max - 1] - c[Min - 1] << "\n";
}
return 0;
}
BuildLca();
cin >> q;
for (int i = 1; i <= q; ++ i){
int node[5];
for (int j = 0; j < 5; ++ j) cin >> node[j], node[j] += 1;
int lca = node[0];
for (int j = 1; j < 5; ++ j) lca = Lca(lca, node[j]);
int res = 0;
for (int j = 1; j < 32; ++ j){
int par, cnt = 0;
for (int z = 0; z < 5; ++ z)
if (j >> z & 1) par = node[z], cnt += 1;
for (int z = 0; z < 5; ++ z)
if (j >> z & 1) par = Lca(node[z], par);
if (cnt & 1) res += Jump(par, h[par] - h[lca]);
if (!(cnt & 1)) res -= Jump(par, h[par] - h[lca]);
}
cout << res << "\n";
}
}
Compilation message (stderr)
roadsideadverts.cpp:85:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
85 | main(){
| ^~~~
roadsideadverts.cpp: In function 'int main()':
roadsideadverts.cpp:146:42: warning: 'par' may be used uninitialized in this function [-Wmaybe-uninitialized]
146 | if (j >> z & 1) par = Lca(node[z], par);
| ~~~^~~~~~~~~~~~~~
roadsideadverts.cpp:110:13: warning: 'sta' may be used uninitialized in this function [-Wmaybe-uninitialized]
110 | init(sta);
| ~~~~^~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |