#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
struct node{
int h,w,id,_w;
}s[114514],f[114514];
int n,dp[114514];
bool cmp(node a,node b){
return a.h<b.h;
}
int getx(int a,int b){
return s[b].h-s[a].h;
}
int gety(int a,int b){
return dp[s[b].id]+s[b].h*s[b].h-s[b].w-dp[s[a].id]-s[a].h*s[a].h+s[a].w;
}
int q[114514];
void cdq(int l,int r){
if(l>=r)return ;
int mid=(l+r)>>1;
int stan=mid;
int i=l-1,j=mid;
for(int t=l;t<=r;t++){
if(s[t].id<=stan){
f[++i]=s[t];
}
else{
f[++j]=s[t];
}
}
for(int t=l;t<=r;t++){
s[t]=f[t];
}
cdq(l,mid);
int head=1,tail=0;
q[++tail]=l;
for(int t=l+1;t<=mid;t++){
while(tail>=head+1&&gety(q[tail-1],q[tail])*getx(q[tail],t)>=
gety(q[tail],t)*getx(q[tail-1],q[tail])){
tail--;
}
q[++tail]=t;
}
for(int t=mid+1;t<=r;t++){
int k=2*s[t].h;
while(tail>=head+1&&gety(q[head],q[head+1])<=
getx(q[head],q[head+1])*k){
head++;
}
int j=q[head];
dp[s[t].id]=min(dp[s[t].id],dp[s[j].id]+(s[j].h-s[t].h)*(s[j].h-s[t].h)
+s[t]._w-s[j].w);
}
cdq(mid+1,r);
i=l,j=mid+1;
int idx=l-1;
while(i<=mid&&j<=r){
if(s[i].h<=s[j].h){
f[++idx]=s[i++];
}
else{
f[++idx]=s[j++];
}
}
while(i<=mid){
f[++idx]=s[i++];
}
while(j<=r){
f[++idx]=s[j++];
}
for(int t=l;t<=r;t++){
s[t]=f[t];
}
return;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&s[i].h);
s[i].id=i;
dp[i]=1e18;
}
for(int i=1;i<=n;i++){
scanf("%lld",&s[i].w);
s[i].w+=s[i-1].w;
s[i]._w=s[i-1].w;
}
sort(s+1,s+n+1,cmp);
dp[1]=0;
cdq(1,n);
printf("%lld",dp[n]);
return 0;
}