제출 #718842

#제출 시각아이디문제언어결과실행 시간메모리
718842OzyHarbingers (CEOI09_harbingers)C++17
100 / 100
225 ms29832 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define debug(a) cout << #a << " = " << a << endl #define debugsl(a) cout << #a << " = " << a << ", " #define rep(i,a,b) for(int i = (a); i <= (b); i++) #define repa(i,a,b) for(int i = (a); i >= (b); i--) #define lli long long int #define pll pair<lli,lli> #define MAX 100000 // para los hijos #define des first #define w second //para el arreglo de lin #define prep first #define vel second //para el convex hull #define m first #define ord second lli n,a,b,c; vector<pll> hijos[MAX+2]; pll lin[MAX+2],ch[MAX+2]; long double anterior[MAX+2]; int ancestros[MAX+2][20]; lli dp[MAX+2],prof[MAX+2],rp[MAX+2]; long double cruce(pll a, pll b) { long double u = a.ord - b.ord; long double v = b.m - a.m; u /= v; return u; } void solve(lli pos, lli padre, lli p) { prof[pos] = p; // responde la pregunta para mi posicion lli x = padre; repa(i,18,0) if (anterior[ancestros[x][i]] > (long double)lin[pos].vel) x = ancestros[x][i]; if (anterior[x] > (long double)lin[pos].vel) x = ancestros[x][0]; dp[pos] = lin[pos].prep + prof[pos]*lin[pos].vel + dp[x] - prof[x]*lin[pos].vel; //hago mi propia línea ch[pos].ord = dp[pos]; ch[pos].m = -prof[pos]; //me integro en el convex hull trick x = padre; repa(i,18,0) if (cruce(ch[pos], ch[ancestros[x][i]]) < anterior[ancestros[x][i]]) x = ancestros[x][i]; if (cruce(ch[pos], ch[x]) < anterior[x]) x = ancestros[x][0]; ancestros[pos][0] = x; anterior[pos] = cruce(ch[pos], ch[x]); rep(i,1,18) { ancestros[pos][i] = ancestros[x][i-1]; x = ancestros[pos][i]; } for(auto h : hijos[pos]) { if (h.des == rp[pos]) continue; rp[h.des] = pos; solve(h.des,pos,p+h.w); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; rep(i,2,n) { cin >> a >> b >> c; hijos[a].push_back({b,c}); hijos[b].push_back({a,c}); } rep(i,2,n) cin >> lin[i].prep >> lin[i].vel; for (auto h : hijos[1]) { rp[h.des] = 1; solve(h.des,0,h.w); } rep(i,2,n) cout << dp[i] << ' '; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...