Submission #426788

#TimeUsernameProblemLanguageResultExecution timeMemory
426788oleh1421Building Bridges (CEOI17_building)C++17
0 / 100
3022 ms3836 KiB
//#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...