제출 #1266861

#제출 시각아이디문제언어결과실행 시간메모리
1266861luis_aqmHarbingers (CEOI09_harbingers)C++20
100 / 100
68 ms19600 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]; int hull[NMAX]; int ptr; double intersecx(int i, int j) { return 1.0 * (dp[i] - dp[j]) / (dist[i] - dist[j]); } void DFS(int v, int pai) { int aux = 0, sz = ptr; if(v != 1) { int l = 0, r = ptr-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]; l = 1, r = ptr; while(l < r) { int m = (l+r) / 2; int j = hull[m], k = hull[m-1]; if(intersecx(v, j) < intersecx(j, k)) r = m; else l = m+1; } aux = hull[r]; hull[r] = v; ptr = r+1; } else { hull[0] = 1; ptr = 1; } for(auto [u, d] : g[v]) { if(u == pai) continue; dist[u] = dist[v] + d; DFS(u, v); } hull[ptr-1] = aux; ptr = sz; } 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...