Submission #1266848

#TimeUsernameProblemLanguageResultExecution timeMemory
1266848luis_aqmHarbingers (CEOI09_harbingers)C++20
30 / 100
1097 ms94836 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define tt tuple<int,int,int> #define NMAX 100005 #define INF 1e16 #define MOD 998244353 #define faster ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); vector<pii> g[NMAX]; int s[NMAX], t[NMAX], dist[NMAX], dp[NMAX]; vector<int> hull; double intersecx(int i, int j) { return 1.0 * (dp[i] - dp[j]) / (dist[i] - dist[j]); } void DFS(int v, int pai) { if(v != 1) { int l = 0, r = hull.size()-1; while(l < r) { int q = (r-l) / 3; int m1 = l+q, m2 = r-q; if(dp[hull[m1]] - dist[hull[m1]]*t[v] < dp[hull[m2]] - dist[hull[m2]]*t[v]) r = m2-1; else l = m1+1; } dp[v] = dp[hull[r]] + (dist[v] - dist[hull[r]]) * t[v] + s[v]; } stack<int> p; while(hull.size() > 1) { int j = hull.back(), k = hull[hull.size()-2]; if(intersecx(v, j) < intersecx(j, k)) { p.push(j); hull.pop_back(); } else break; } hull.push_back(v); for(auto [u, d] : g[v]) { if(u == pai) continue; dist[u] = dist[v] + d; DFS(u, v); } hull.pop_back(); while(!p.empty()) { hull.push_back(p.top()); p.pop(); } } int32_t main(){ faster int n; cin>>n; for(int i = 1; i < n; i++) { int a, b, c; cin>>a>>b>>c; g[a].push_back({b, c}); g[b].push_back({a, c}); } for(int i = 2; i <= n; i++) { cin>>s[i]>>t[i]; } DFS(1, 0); for(int i = 2; i <= n; i++) { cout<<dp[i]<<" "; } cout<<"\n"; } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...