Submission #612741

#TimeUsernameProblemLanguageResultExecution timeMemory
612741RandomLBHarbingers (CEOI09_harbingers)C++17
100 / 100
121 ms21756 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pi; #define siz(x) (int)x.size() #define pb push_back const ll LLINF = 0x3f3f3f3f3f3f3f3f; /*=========================================== ===========================================*/ const int MAX = 1e5+5; vector<pi> adj[MAX]; int sub[MAX], pp[MAX], heavy[MAX], in[MAX], head[MAX], curr; ll a[MAX], b[MAX], dep[MAX], dp[MAX]; vector<int> q[MAX]; int dfs(int v, int p){ for (auto[u, w]: adj[v]){ if (u == p) continue; pp[u] = v; dep[u] = dep[v]+w; sub[v] += dfs(u, v); if (sub[u] > sub[heavy[v]]) heavy[v] = u; } return ++sub[v]; } void decomp(int v, int h, int p){ in[v] = ++curr; head[v] = h; if (heavy[v]) decomp(heavy[v], h, v); for (auto[u, w]: adj[v]){ if (u == p || u == heavy[v]) continue; decomp(u, u, v); } } ll dv(ll x, ll y) { // floored division return x / y - ((x ^ y) < 0 && x % y); } inline ll sect(int x, int y){ return dv(dp[y]-dp[x], dep[y]-dep[x]); } int query(int i, ll x){ int l = -1, r = siz(q[i])-1; while (l+1 < r){ int m = l+(r-l)/2; if (sect(q[i][m], q[i][m+1]) >= x) r = m; else l = m; } return q[i][r]; } void add(int i, int x){ while (siz(q[i]) > 1 && sect(q[i].back(), q[i][siz(q[i])-2]) >= sect(q[i].back(), x)) q[i].pop_back(); q[i].pb(x); } void solve(int v, int p){ int x = v; if (x == head[x]) x = pp[x]; while (x){ int u = query(head[x], b[v]); dp[v] = min(dp[v], a[v]+b[v]*dep[v] - b[v]*dep[u]+dp[u]); x = pp[head[x]]; } add(head[v], v); for (auto[u, w]: adj[v]){ if (u == p || u == heavy[v]) continue; solve(u, v); } if (heavy[v]) solve(heavy[v], v); } int main(){ cin.tie(0)->sync_with_stdio(0); int n; cin >> n; for (int i = 1; i < n; i++){ int a, b, w; cin >> a >> b >> w; adj[a].pb({b, w}); adj[b].pb({a, w}); } for (int i = 2; i <= n; i++){ cin >> a[i] >> b[i]; dp[i] = LLINF; } dfs(1, -1); decomp(1, 1, -1); solve(1, -1); for (int i = 2; i <= n; i++) cout << dp[i] << (i==n?"\n":" "); }
#Verdict Execution timeMemoryGrader output
Fetching results...