Submission #263249

#TimeUsernameProblemLanguageResultExecution timeMemory
263249alexandra_udristoiuBuilding Bridges (CEOI17_building)C++14
30 / 100
129 ms5800 KiB
#include<iostream> #define DIM 100005 #define x first #define y second using namespace std; int n, i, m; int h[DIM], w[DIM]; pair<int, int> aint[40 * DIM], p[DIM]; long long sum, d[DIM]; long long calc(pair<int, int> p, int a){ return p.x * 1LL * a + p.y; } void build(int nod, int st, int dr){ aint[nod] = p[1]; if(st != dr){ int mid = (st + dr) / 2; build(2 * nod, st, mid); build(2 * nod + 1, mid + 1, dr); } } void update(int nod, int st, int dr, pair<int, int> p){ int mid = (st + dr) / 2; if( calc(aint[nod], mid) > calc(p, mid) ){ swap(aint[nod], p); } if(st != dr){ if( calc(aint[nod], st) < calc(p, st) ){ update(2 * nod + 1, mid + 1, dr, p); } else{ update(2 * nod, st, mid, p); } } } long long query(int nod, int st, int dr, int p){ if(st == dr){ return calc(aint[nod], p); } else{ int mid = (st + dr) / 2; long long x; if(p <= mid){ x = query(2 * nod, st, mid, p); } else{ x = query(2 * nod + 1, mid + 1, dr, p); } return min(x, calc(aint[nod], p) ); } } int main(){ cin>> n; for(i = 1; i <= n; i++){ cin>> h[i]; } for(i = 1; i <= n; i++){ cin>> w[i]; m = max(m, h[i]); sum += w[i]; p[i].y = h[i] * 1LL * h[i] - w[i]; p[i].x = -2 * h[i]; } build(1, 0, m); for(i = 2; i <= n; i++){ d[i] = query(1, 0, m, h[i]) - w[i] + h[i] * 1LL * h[i]; p[i].y = d[i] + h[i] * 1LL * h[i]; update(1, 0, m, p[i]); } cout<< d[n] + sum; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...