This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> line;
const int N=1000010;
const ll mod=1000000007;
const ll inf=1e15;
ll h[N],w[N];
ll dp[N];
ll a[N],b[N];
line t[N];
ll f(line cur,ll x){
return cur.first*x+cur.second;
}
int TOT=1;
int L[N],R[N];
void upd(int v,int l,int r,line cur){
// cout<<v<<" "<<l<<" "<<r<<endl;
ll mid=(l+r)/2;
if (f(t[v],mid)>f(cur,mid)) swap(t[v],cur);
if (cur.second==inf || l==r) return;
if (f(t[v],l)>f(cur,l)){
if (!L[v]) L[v]=++TOT;
upd(L[v],l,mid,cur);
} else {
if (!R[v]) R[v]=++TOT;
upd(R[v],mid+1,r,cur);
}
}
ll get(int v,int l,int r,int pos){
// cout<<v<<" "<<l<<" "<<r<<endl;
if (l==r) return f(t[v],pos);
if (!v) return inf;
int mid=(l+r)/2;
if (pos<=mid) return min(f(t[v],pos),get(L[v],l,mid,pos));
else return min(f(t[v],pos),get(R[v],mid+1,r,pos));
}
int main(){
t[0]={1e9,inf};
t[1]={1e9,inf};
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
for (int i=1;i<=n;i++) cin>>h[i];
for (int i=1;i<=n;i++) cin>>w[i],w[i]+=w[i-1];
dp[1]=0;
a[1]=h[1]*h[1]-w[1]+dp[1];
b[1]=-2*h[1];
upd(1,0,1e9,{b[1],a[1]});
// cout<<"Line "<<b[1]<<" "<<a[1]<<endl;
for (int i=2;i<=n;i++){
// dp[i]=min(inf,get(1,0,1e9,h[i]));
for (int j=1;j<i;j++){
dp[i]=min(dp[i],a[j]+b[j]*h[i]);
}
dp[i]+=h[i]*h[i]+w[i-1];
// cout<<i<<" "<<dp[i]<<endl;
a[i]=h[i]*h[i]+dp[i]-w[i];
b[i]=-2*h[i];
upd(1,0,1e9,{b[i],a[i]});
// cout<<"Line "<<b[i]<<" "<<a[i]<<endl;
}
cout<<dp[n]<<endl;
return 0;
}
/**
6
3 8 7 1 6 6
0 -1 9 1 2 0
**/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |