Submission #1212809

#TimeUsernameProblemLanguageResultExecution timeMemory
1212809g4yuhgHarbingers (CEOI09_harbingers)C++20
100 / 100
72 ms19880 KiB
//Huyduocdithitp #include <bits/stdc++.h> #define int long long 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 100005 using namespace std; struct Line { ll a, b; }; struct Node { pii cu; ll pos, sz; }; vector<Node> undo; ll n, d[N], F[N]; vector<pii> adj[N]; ll S[N], V[N], sz = 0; Line A[200005]; ll ptr = 0; bool bad(Line l1, Line l2, Line l3) { return double(l3.b - l1.b) / (l1.a - l3.a) < double(l2.b - l1.b) / (l1.a - l2.a); } void add(ll u, ll v) { Line xet = {u, v}; ll l = 1, r = sz - 1, ans = sz; while (l <= r) { ll mid = (l + r) / 2; if (bad(A[mid - 1], A[mid], xet)) { ans = mid; r = mid - 1; } else { l = mid + 1; } } undo.push_back({{A[ans].a, A[ans].b}, ans, sz}); A[ans] = xet; sz = ans + 1; } void Undo() { sz = undo.back().sz; A[undo.back().pos] = {undo.back().cu.fi, undo.back().cu.se}; undo.pop_back(); } ll cal(Line U, ll x) { return U.a * x + U.b; } ll qr(ll x) { if (sz == 0) return 0; ll ans = cal(A[0], x); /*for (int i = 1; i < sz; i ++) { ans = min(ans, cal(A[i], x)); } return ans;*/ ll l = 1, r = sz - 1; while (l <= r) { ll mid = (l + r) / 2; if (cal(A[mid], x) < cal(A[mid - 1], x)) { ans = min(ans, cal(A[mid], x)); l = mid + 1; } else { r = mid - 1; } } return ans; } void dfs(ll u, ll parent) { if (u == 1) { add(0, 0); } else { F[u] = qr(V[u]) + S[u] + V[u] * d[u]; add(-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); } if (u != 1) { Undo(); } } 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...