Submission #1302055

#TimeUsernameProblemLanguageResultExecution timeMemory
1302055LIAHarbingers (CEOI09_harbingers)C++17
40 / 100
141 ms60180 KiB
// // Created by liasa on 13/12/2025. // #include <bits/stdc++.h> using namespace std; #define ll long long #define v vector #define lp(i, s, e) for (int i = s; i < e; ++i) #define pll pair<ll, ll> struct Line { ll m, b; ll f(ll x) { return m * x + b; } }; vector<ll> values; const ll inf = 1e9; struct LiChao { v<Line> seg; stack<pair<int, Line>> st; ll sz = 1; LiChao(ll n1) { for (; sz < n1; sz *= 2) ; seg.resize(4 * sz, {0, inf}); } void update(ll i, ll l, ll r, Line &add) { ll mid = (l + r) / 2; ll x_val = values[mid]; if (add.f(x_val) < seg[i].f(x_val)) { st.push({i, seg[i]}); swap(add, seg[i]); } if (l == r) return; ll x_l = values[l], x_r = values[r]; if (add.f(x_l) < seg[i].f(x_l)) { update(i * 2, l, mid, add); } else update(i * 2 + 1, mid + 1, r, add); } ll query(ll i, ll l, ll r, ll x) { ll res = seg[i].f(x); if (l == r) return res; ll mid = (l + r) / 2; ll mid_val = values[mid]; if (x <= mid_val) { return min(res, query(i * 2, l, mid, x)); } else return min(res, query(i * 2 + 1, mid + 1, r, x)); } }; v<ll> dp; ll n; v<pll> kn; v<v<pll>> g; v<ll> dpt; ll values_n; void rollback(LiChao &lc, ll pic) { while (lc.st.size() > pic) { auto [i, segi] = lc.st.top(); lc.seg[i] = segi; lc.st.pop(); } } // dp[v] = st[v] + sp[v]*dpt[v] + min(dp[u] - sp[v]*dpt[u] void dfs(int node, int par, LiChao &lc) { ll pic = lc.st.size(); ll d = dpt[node]; auto [st, sp] = kn[node]; ll qu = lc.query(1, 0, values_n - 1, sp); ll my_dp = st + sp * d + qu; dp[node] = my_dp; Line addi = {-d, my_dp}; lc.update(1, 0, values_n - 1, addi); for (auto [it, d_add] : g[node]) { if (it != par) { dfs(it, node, lc); } } rollback(lc, pic); } void dfs1(ll node, ll par, ll dpa) { // values.push_back(dpa); dpt[node] = dpa; for (auto [it, d_add] : g[node]) { if (it != par) dfs1(it, node, dpa + d_add); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; g.resize(n); dp.resize(n); kn.resize(n); dpt.resize(n, 0); lp(i, 0, n - 1) { ll a, b, c; cin >> a >> b >> c; a--; b--; g[a].push_back({b, c}); g[b].push_back({a, c}); } dp[0] = 0; dfs1(0, -1, 0); lp(i, 1, n) { ll st, speed; cin >> st >> speed; values.push_back(speed); kn[i] = {st, speed}; } sort(values.begin(), values.end()); values.erase(unique(values.begin(), values.end()), values.end()); values_n = values.size(); LiChao lc(values_n); Line bb = {0, 0}; lc.update(1, 0, values_n - 1, bb); dfs(0, -1, lc); lp(i, 1, n) { cout << dp[i] << " "; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...