// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class T>
bool minimize(T &a, const T &b) {
if (a > b) return a = b, true;
return false;
}
template<class T>
bool maximize(T &a, const T &b) {
if (a < b) return a = b, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
/*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 2e5 + 5;
int numNode, par[N], S[N], V[N];
ll d[N], f[N];
vector<ii> G[N];
struct Line {
ll a, b;
Line (ll _a = 0, ll _b = 0): a(_a), b(_b) {}
ll eval(ll x) {return a * x + b;}
Line operator - (const Line &other) {
return Line(a - other.a, b - other.b);
}
};
bool useless(Line l1, Line l2, Line l3) {
l3 = l3 - l1;
l2 = l2 - l1;
return (__int128)l2.a * l3.b - (__int128)l3.a * l2.b >= 0;
}
Line L[N];
int num;
ll query(ll x) {
int l = 0, r = num - 1;
while(l < r) {
int mid = (l + r + 1) / 2;
if (L[mid-1].eval(x) >= L[mid].eval(x)) l = mid;
else r = mid - 1;
}
return L[l].eval(x);
}
int ins(Line li) {
if (num < 2 || !useless(L[num-2], L[num-1], li)) return num;
int l = 1, r = num - 1;
while(l < r) {
int mid = (l + r) >> 1;
if (useless(L[mid-1], L[mid], li)) r = mid;
else l = mid + 1;
}
return l;
}
void dfs(int u) {
f[u] = S[u] + 1LL * d[u] * V[u] + query(V[u]);
Line li = Line(-d[u], f[u]);
int prv_pos = ins(li), prv_sz = num;
Line prv_li = L[prv_pos];
L[prv_pos] = li;
num = prv_pos + 1;
for(ii v : G[u]) if (v.fi != par[u]) {
par[v.fi] = u;
d[v.fi] = d[u] + v.se;
dfs(v.fi);
}
num = prv_sz;
L[prv_pos] = prv_li;
}
void init(void) {
cin >> numNode;
FOR(i, 2, numNode) {
int u, v, c;
cin >> u >> v >> c;
G[u].pb(mp(v, c));
G[v].pb(mp(u, c));
}
FOR(i, 2, numNode) cin >> S[i] >> V[i];
}
void process(void) {
memset(f, 0x3f, sizeof f);
f[1] = 0;
dfs(1);
FOR(i, 2, numNode) cout << f[i] << ' ';
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
Compilation message (stderr)
harbingers.cpp: In function 'int main()':
harbingers.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
123 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
124 | freopen(task".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |