Submission #718650

#TimeUsernameProblemLanguageResultExecution timeMemory
718650OzyHarbingers (CEOI09_harbingers)C++17
0 / 100
4 ms2644 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 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]; lli 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]] >= lin[pos].vel) x = ancestros[x][i]; //if (anterior[x] >= lin[pos].vel) x = ancestros[x][0]; while (anterior[x] >= 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; while (x != 0) if (cruce(ch[pos], ch[x]) < anterior[x]) x = ancestros[x][0]; else break; ancestros[pos][0] = x; anterior[pos] = cruce(ch[pos], ch[x]); repa(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() { freopen("D:/OneDrive/OMI/C/Algoritmos y Estructuras/li_chao_tree/harbringers/bin/Debug/0-harbingers.in", "r", stdin); 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; }

Compilation message (stderr)

harbingers.cpp: In function 'int main()':
harbingers.cpp:73:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |     freopen("D:/OneDrive/OMI/C/Algoritmos y Estructuras/li_chao_tree/harbringers/bin/Debug/0-harbingers.in", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...