제출 #426704

#제출 시각아이디문제언어결과실행 시간메모리
426704oleh1421Building Bridges (CEOI17_building)C++17
0 / 100
188 ms131072 KiB
//#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...