Submission #964790

#TimeUsernameProblemLanguageResultExecution timeMemory
964790Chmayank2009Building Bridges (CEOI17_building)C++17
100 / 100
82 ms67288 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; const long long inf=1e18; const long long N=1e6+1; struct Line{ long long m=0,c=inf; }; vector<Line>seg(4*1e6+1); long long calc(Line Li,long long x){ return Li.m*x+Li.c; } void insert(Line Li,long long i=1,long long l=0,long long r=N){ long long m=l+(r-l)/2; long long mid=calc(Li,m)<calc(seg[i],m); long long left=calc(Li,l)<calc(seg[i],l); if(mid){ swap(seg[i],Li); } if(r-l==1) return; if(left!=mid){ insert(Li,2*i,l,m); } else{ insert(Li,2*i+1,m,r); } } long long get(long long x,long long i=1,long long l=0,long long r=N){ long long m=l+(r-l)/2; long long curr=calc(seg[i],x); if(r-l==1) return curr; if(x<m){ return min(curr,get(x,2*i,l,m)); } else{ return min(curr,get(x,2*i+1,m,r)); } } int main(){ long long n; cin>>n; vector<long long>h(n+1); vector<long long>w(n+1); for(long long i=1;i<=n;i++){ cin>>h[i]; } for(long long i=1;i<=n;i++){ cin>>w[i]; } vector<long long>suf(n+1); suf[n]=w[n]; for(long long i=n-1;i>0;i--){ suf[i]=suf[i+1]+w[i]; } vector<long long>dp(n+1); Line Li; Li.m=-2*h[1]; Li.c=suf[1]-w[1]+h[1]*h[1]; dp[1]=0; insert(Li); for(long long i=2;i<=n;i++){ //cout<<get(h[i])<<"\n"; dp[i]=get(h[i])-suf[i]+h[i]*h[i]; Li.m=-2*h[i]; Li.c=h[i]*h[i]+dp[i]+suf[i]-w[i]; insert(Li); } cout<<dp[n]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...