Submission #1190561

#TimeUsernameProblemLanguageResultExecution timeMemory
1190561g4yuhgHarbingers (CEOI09_harbingers)C++20
100 / 100
65 ms24488 KiB
//Huyduocdithitp #include <bits/stdc++.h> typedef long long ll; #define endl '\n' #define yes cout<<"YES"<<endl; #define no cout<<"NO"<<endl; #define fi first #define se second #define pii pair<ll, ll> #define inf 1e18 #define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); #define MP make_pair #define TASK "ghuy4g" #define start if(fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin);freopen(TASK".out","w",stdout);} #define LOG 19 #define N 300010 using namespace std; struct op { ll pos, top; pii ov;// cai doan bi ghi de }; ll n; vector<pii> adj[N]; ll S[N], V[N]; pii lines[N]; vector<op> undo; ll top; bool bad(pii a, pii b, pii c) { return (double)(b.se - a.se) / (a.fi - b.fi) >= (double)(c.se - a.se) / (a.fi - c.fi); } ll cal(pii u, ll x) { return u.fi * x + u.se; } ll get(ll x) { ll l = 0, r = top - 2, ans = cal(lines[l], x); while (l <= r) { ll mid = (l + r) / 2; ll X = cal(lines[mid], x); ll Y = cal(lines[mid + 1], x); if (X > Y) { l = mid + 1; } else { r = mid - 1; } ans = min(ans, min(X, Y)); } /*while (l < r) { ll mid = (l + r) / 2; ll X = cal(lines[mid], x); ll Y = cal(lines[mid + 1], x); if (X > Y) { l = mid + 1; } else { r = mid; } ans = min(ans, min(X, Y)); }*/ return ans; } void inLine(pii newLine) { ll l = 1, r = top - 1, k = top; // neu khong tim dc vi tri bad=>top while (l <= r) { ll mid = (l + r) / 2; if (bad(lines[mid - 1], lines[mid], newLine)) { k = mid; r = mid - 1; } else { l = mid + 1; } } undo.push_back({k, top, lines[k]}); top = k + 1; lines[k] = newLine; //cout << top << " " << k << endl; } void lui() { op xet = undo.back(); undo.pop_back(); top = xet.top; lines[xet.pos] = xet.ov; //cout << "lui " << top << " " << xet.pos << endl; } ll d[N], f[N]; void dfs(ll u, ll parent) { if (u != 1) { f[u] = get(V[u]) + S[u] + V[u] * d[u]; } inLine({-d[u], f[u]}); for (auto v : adj[u]) { if (v.fi == parent) continue; d[v.fi] = d[u] + v.se; dfs(v.fi, u); } lui(); } signed main(void) { faster; cin >> n; for (int i = 1; i <= n - 1; i ++) { ll u, v, w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } for (int i = 2; i <= n; i ++) { cin >> S[i] >> V[i]; } dfs(1, 1); for (int i = 2; i <= n; i ++) { cout << f[i] << " "; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...