#include "bits/stdc++.h"
#define endl '\n'
#define int long long
constexpr int maxn = 1e5+5;
constexpr int mod = 1e9+7;
using namespace std;
using lint = long long;
constexpr lint maxk = 1e9;
constexpr lint inf = 1e18;
using pll = pair<lint, lint>;
int n;
lint val[maxn];
vector<int> adj[maxn];
int m, h;
int tin[maxn], tout[maxn], b[2 * maxn], p[maxn];
pll t[4 * maxn];
int lz[2 * maxn];
bool vis[maxn];
lint ans;
void dfs(int u) {
b[m] = u;
tin[u] = m;
m++;
for(int v : adj[u])
if(v != p[u]) {
p[v] = u;
dfs(v);
}
b[m] = u;
tout[u] = m;
m++;
}
void build() {
h = 8 * sizeof(int) - __builtin_clz(m);
for(int i = 0; i < m; i++) {
t[m + i].first = val[b[i]];
t[m + i].second = b[i];
}
for(int i = m - 1; i >= 1; i--) {
t[i] = max(t[i << 1], t[i << 1 | 1]);
lz[i] = 1;
}
}
void apply(int u, lint val) {
t[u].first *= val;
if(u < m)
lz[u] *= val;
}
void fixup(int u) {
for(u >>= 1; u; u >>= 1) {
t[u] = max(t[u << 1], t[u << 1 | 1]);
t[u].first *= lz[u];
}
}
void push(int u) {
for(int k = h; k > 0; k--) {
int s = u >> k;
if(!s)
continue;
apply(s << 1, lz[s]);
apply(s << 1 | 1, lz[s]);
lz[s] = 1;
}
}
void update(int l, int r, lint k) {
l += m;
r += m;
int l0 = l, r0 = r;
for(; l <= r; l >>= 1, r >>= 1) {
if(l & 1)
apply(l++, k);
if(r + 1 & 1)
apply(r--, k);
}
fixup(l0);
fixup(r0);
}
pll query(int l, int r) {
pll ret = {-inf, 0};
if(l > r)
return ret;
l += m;
r += m;
push(l);
push(r);
for(; l <= r; l >>= 1, r >>= 1) {
if(l & 1)
ret = max(ret, t[l++]);
if(r + 1 & 1)
ret = max(ret, t[r--]);
}
return ret;
}
void solve(int u) {
vis[u] = true;
if(adj[u].size() <= 1) {
update(tin[u], tout[u], 0);
return;
}
while(true) {
lint x, mx;
tie(x, mx) = query(tin[u], tout[u]);
if(u == mx) {
for(int v : adj[u]) {
if(vis[v] || p[u] == v)
continue;
ans += x + query(tin[v], tout[v]).first;
solve(v);
update(tin[v], tout[v], 0);
}
update(tin[u], tout[u], 0);
return;
}
else {
lint q1 = query(tin[u], tin[mx] - 1).first;
lint q2 = query(tout[mx] + 1, tout[u]).first;
lint comp2 = max(q1, q2);
ans += comp2 + x;
solve(mx);
update(tin[mx], tout[mx], 0);
}
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for(int i = 1; i <= n; i++)
cin >> val[i];
if(n == 1) {
cout << 0 << endl;
return 0;
}
if(n == 2) {
cout << val[1] + val[2] << endl;
return 0;
}
for(int i = 1, u, v; i < n; i++) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int root = -1;
for(int i = 1; i <= n; i++)
if(adj[i].size() > 1) {
root = i;
break;
}
dfs(root);
build();
solve(root);
cout << ans << endl;
}
Compilation message
sjekira.cpp: In function 'void update(long long int, long long int, lint)':
sjekira.cpp:79:14: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
79 | if(r + 1 & 1)
| ~~^~~
sjekira.cpp: In function 'pll query(long long int, long long int)':
sjekira.cpp:97:14: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
97 | if(r + 1 & 1)
| ~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2636 KB |
Output is correct |
2 |
Correct |
2 ms |
2636 KB |
Output is correct |
3 |
Correct |
2 ms |
2680 KB |
Output is correct |
4 |
Correct |
2 ms |
2636 KB |
Output is correct |
5 |
Correct |
3 ms |
2636 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
128 ms |
20748 KB |
Output is correct |
2 |
Correct |
93 ms |
16732 KB |
Output is correct |
3 |
Correct |
89 ms |
16244 KB |
Output is correct |
4 |
Correct |
107 ms |
17680 KB |
Output is correct |
5 |
Correct |
156 ms |
25116 KB |
Output is correct |
6 |
Correct |
185 ms |
25148 KB |
Output is correct |
7 |
Correct |
164 ms |
22152 KB |
Output is correct |
8 |
Correct |
145 ms |
20384 KB |
Output is correct |
9 |
Correct |
95 ms |
14276 KB |
Output is correct |
10 |
Correct |
184 ms |
25156 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2636 KB |
Output is correct |
2 |
Correct |
2 ms |
2636 KB |
Output is correct |
3 |
Correct |
2 ms |
2680 KB |
Output is correct |
4 |
Correct |
2 ms |
2636 KB |
Output is correct |
5 |
Correct |
3 ms |
2636 KB |
Output is correct |
6 |
Correct |
2 ms |
2892 KB |
Output is correct |
7 |
Correct |
3 ms |
2816 KB |
Output is correct |
8 |
Correct |
2 ms |
2764 KB |
Output is correct |
9 |
Correct |
2 ms |
2892 KB |
Output is correct |
10 |
Correct |
3 ms |
2816 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2636 KB |
Output is correct |
2 |
Correct |
2 ms |
2636 KB |
Output is correct |
3 |
Correct |
2 ms |
2680 KB |
Output is correct |
4 |
Correct |
2 ms |
2636 KB |
Output is correct |
5 |
Correct |
3 ms |
2636 KB |
Output is correct |
6 |
Correct |
128 ms |
20748 KB |
Output is correct |
7 |
Correct |
93 ms |
16732 KB |
Output is correct |
8 |
Correct |
89 ms |
16244 KB |
Output is correct |
9 |
Correct |
107 ms |
17680 KB |
Output is correct |
10 |
Correct |
156 ms |
25116 KB |
Output is correct |
11 |
Correct |
185 ms |
25148 KB |
Output is correct |
12 |
Correct |
164 ms |
22152 KB |
Output is correct |
13 |
Correct |
145 ms |
20384 KB |
Output is correct |
14 |
Correct |
95 ms |
14276 KB |
Output is correct |
15 |
Correct |
184 ms |
25156 KB |
Output is correct |
16 |
Correct |
2 ms |
2892 KB |
Output is correct |
17 |
Correct |
3 ms |
2816 KB |
Output is correct |
18 |
Correct |
2 ms |
2764 KB |
Output is correct |
19 |
Correct |
2 ms |
2892 KB |
Output is correct |
20 |
Correct |
3 ms |
2816 KB |
Output is correct |
21 |
Correct |
34 ms |
7000 KB |
Output is correct |
22 |
Correct |
35 ms |
6220 KB |
Output is correct |
23 |
Correct |
167 ms |
20228 KB |
Output is correct |
24 |
Correct |
114 ms |
15196 KB |
Output is correct |
25 |
Correct |
109 ms |
15076 KB |
Output is correct |
26 |
Correct |
67 ms |
10940 KB |
Output is correct |
27 |
Correct |
84 ms |
12440 KB |
Output is correct |
28 |
Correct |
137 ms |
15680 KB |
Output is correct |
29 |
Correct |
86 ms |
11540 KB |
Output is correct |
30 |
Correct |
168 ms |
21104 KB |
Output is correct |