이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> line;
const int N=6000010;
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;
}
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) return;
if (f(t[v],l)>f(cur,l)){
upd(v+v,l,mid,cur);
} else {
upd(v+v+1,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);
int mid=(l+r)/2;
if (pos<=mid) return min(f(t[v],pos),get(v+v,l,mid,pos));
else return min(f(t[v],pos),get(v+v+1,mid+1,r,pos));
}
int main(){
for (int i=0;i<N;i++) t[i]={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,1e6,{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,1e6,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,1e6,{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... |