Submission #1298018

#TimeUsernameProblemLanguageResultExecution timeMemory
1298018jahongirHarbingers (CEOI09_harbingers)C++20
100 / 100
135 ms18284 KiB
#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define pll pair<ll,ll> #define vi vector<int> #define pb push_back #define all(a) a.begin(),a.end() ll isect(pll a, pll b){ return (a.second - b.second)/(b.first - a.first); } const int mxn = 1e5+1; vector<pii> g[mxn]; ll vel[mxn],cost[mxn],dp[mxn]; pll vec[mxn+5]; int cur = 1; ll get(ll x){ int l = 0, r = cur-1; while(l < r){ int mid = (l+r)>>1; if(isect(vec[mid],vec[mid+1]) < x) l = mid+1; else r = mid; } return vec[l].first * x + vec[l].second; } ll lower(pll Line){ if(cur < 2 || isect(Line,vec[cur-1]) >= isect(vec[cur-2],vec[cur-1])) return cur; int l = 1, r = cur-1; while(l < r){ int mid = (l+r)>>1; if(isect(Line,vec[mid]) < isect(vec[mid],vec[mid-1])) r = mid; else l = mid+1; } return l; } void dfs(int u, int p, ll dep){ dp[u] = get(vel[u]) + dep*vel[u] + cost[u]; pll Line = {-dep,dp[u]}; int prev_cur = cur; int prev_pos = cur = lower(Line); pll prev_line = vec[prev_pos]; vec[cur++] = Line; for(auto [v,c] : g[u]) if(v!=p) dfs(v,u,dep+c); cur = prev_cur; vec[prev_pos] = prev_line; } void solve(){ int n; cin >> n; for(int i = 1; i < n; i++){ int u,v,c; cin >> u >> v >> c; g[u].pb({v,c}); g[v].push_back({u,c}); } for(int i = 2; i <= n; i++) cin >> cost[i] >> vel[i]; vec[0] = {0,0}; for(auto [v,c] : g[1]) dfs(v,1,c); for(int i = 2; i <= n; i++) cout << dp[i] << ' '; } signed main(){ cin.tie(0)->sync_with_stdio(0); int t = 1; // cin >> t; while(t--){solve();} }
#Verdict Execution timeMemoryGrader output
Fetching results...