Submission #540869

#TimeUsernameProblemLanguageResultExecution timeMemory
540869DeepessonBuilding Bridges (CEOI17_building)C++17
100 / 100
112 ms7980 KiB
#include <bits/stdc++.h> #define MAX 210000 typedef long long ftype; typedef std::pair<ftype,ftype> point; ftype f(point a, ftype x) { return a.first*x + a.second; } const long long val = 1LL<<30LL; const int maxn = 2e5; const int membros = 35 * maxn; point mem[membros]; int lefta[membros],righta[membros]; int cur=3; int alocar(void){ int x=cur; if(x==35*maxn)assert(0); cur++; mem[x]={0,1LL<<62LL}; return x; } int inicio = alocar(); void add_line(point nw, int v = inicio, long long l = -val, long long r = val) { long long m = (l + r) / 2LL; bool lef = f(nw, l) < f(mem[v], l); bool mid = f(nw, m) < f(mem[v], m); if(mid) { std::swap(mem[v], nw); } if(r-l==1) { return; } else if(lef != mid) { if(!lefta[v])lefta[v]=alocar(); add_line(nw, lefta[v], l, m); } else { if(!righta[v])righta[v]=alocar(); add_line(nw,righta[v], m, r); } } ftype get(int x, int v = inicio, long long l = -val, long long r = val) { if(!v)return 1LL<<62LL; long long m = (l + r) / 2LL; if(r-l==1) { return f(mem[v], x); } else if(x < m) { return std::min(f(mem[v], x), get(x, lefta[v], l, m)); } else { return std::min(f(mem[v], x), get(x, righta[v], m, r)); } } using ll = long long; int main() { ll N; std::cin>>N; ll a[N],b[N]; for(auto&x:a)std::cin>>x; for(auto&x:b)std::cin>>x; ll p[N]; { ll s=0; for(int i=0;i!=N;++i){ s+=b[i]; p[i]=s; } } ll resp; for(int i=0;i!=N;++i){ ll custo=0; if(i){ ll ans = get(a[i]); custo=ans+(a[i]*a[i])+p[i-1]; } resp=custo; add_line({-2LL*a[i],(a[i]*a[i])+custo-p[i]}); } std::cout<<resp<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...