#include <cstdio>
#include <stack>
#include <cstring>
#include <cassert>
#include <string>
#include <deque>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
#include <utility>
using namespace std;
using ll = long long;
using ld = long double;
#define ShinLena cin.tie(nullptr)->sync_with_stdio(false)
#define N 100005
#define ALL(x) x.begin(), x.end()
struct line
{
ll m, c;
line(ll m, ll c) : m(m), c(c) {}
line() : m(0), c(0) {}
inline ll operator[](ll x) { return m*x+c; }
inline ll intersect(line &l) { return (ld)(c-l.c)/(l.m-m); }
};
int n, s[N], v[N];
ll rt[N], dp[N];
vector<pair<int, int>> g[N];
line cht[N]; int sz;
inline int add(line k)
{
if (sz == 1 || sz > 1 && cht[sz].intersect(cht[sz-1]) < cht[sz-1].intersect(k)) return sz+1;
int l = 2, r = sz, z = -1;
for (; l <= r;)
{
int m = (l+r)/2;
if (cht[m].m == k.m && cht[m].c <= k.c) z = m, l = m + 1;
else if (cht[m].m == k.m && cht[m].c > k.c) return -1;
else if (cht[m].intersect(cht[m-1]) > cht[m-1].intersect(k)) z = m, l = m + 1;
else r = m - 1;
}
return z;
}
inline ll qry(ll x)
{
int l = 0, r = sz - 1, z = sz;
for (;l <= r;)
{
int m = (l+r)/2;
if (cht[m].intersect(cht[m+1]) < x) l=m+1;
else r=m-1, z = m;
}
return cht[z][x];
}
void dfs(int u, int p)
{
int psz = sz;
dp[u] = s[u] + 1ll*v[u]*rt[u] - qry(v[u]);
dp[1] = 0;
int at = add(line{rt[u], -dp[u]});
line overwrote = cht[at];
if (at != -1) cht[at] = line{rt[u], -dp[u]}, sz = at;
for (auto [w, v] : g[u]) if (v != p) rt[v] = rt[u] + w, dfs(v, u);
if (at != -1)
{
sz = psz;
cht[at] = overwrote;
}
}
int main()
{
cht[sz=1] = {0, 0};
ShinLena;
cin >> n;
for (int u, v, w, i = 1; i < n; ++i) cin >> u >> v >> w, g[u].emplace_back(w, v), g[v].emplace_back(w, u);
for (int i = 2; i <= n; ++i) cin >> s[i] >> v[i];
dfs(1, 1);
for (int i = 2; i <= n; ++i) cout << dp[i] << ' ';
return 0;
}
Compilation message
harbingers.cpp: In function 'int add(line)':
harbingers.cpp:37:27: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
37 | if (sz == 1 || sz > 1 && cht[sz].intersect(cht[sz-1]) < cht[sz-1].intersect(k)) return sz+1;
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
4700 KB |
Output isn't correct |
2 |
Incorrect |
4 ms |
5212 KB |
Output isn't correct |
3 |
Incorrect |
46 ms |
11600 KB |
Output isn't correct |
4 |
Incorrect |
64 ms |
14996 KB |
Output isn't correct |
5 |
Incorrect |
85 ms |
18516 KB |
Output isn't correct |
6 |
Incorrect |
116 ms |
21556 KB |
Output isn't correct |
7 |
Incorrect |
76 ms |
11852 KB |
Output isn't correct |
8 |
Incorrect |
87 ms |
15824 KB |
Output isn't correct |
9 |
Incorrect |
87 ms |
17796 KB |
Output isn't correct |
10 |
Incorrect |
90 ms |
16784 KB |
Output isn't correct |