Submission #1264741

#TimeUsernameProblemLanguageResultExecution timeMemory
1264741minhpkBuilding Bridges (CEOI17_building)C++20
0 / 100
21 ms3776 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a;
int z[1000005];
int prefix[1000005];
// hj^2 -2hi*hj -prefix[j]  + (hi^2 +prefix[i-1]);
struct line{
      int a,b;
};
int dp[1000005];
vector <line> v;
int inf=1e16;
int query(int x){
    if (v.size()==1){
        return v[0].a*x+v[0].b;
    }
    int l=1;
    int r=v.size()-1;
    int pos=inf;
    while (l<=r){
         int mid=(l+r)/2;
         int val1=v[mid].a*x+v[mid].b;
         int val2=v[mid-1].a*x+v[mid-1].b;
         pos=min({pos,val1,val2});
         if (val1>val2){
             r=mid-1;
         }else{
             l=mid+1;
         }
    }

    return pos;
}
bool cal(line c,line b,line a){
      return (c.b-a.b)*(a.a-b.a)>(b.b-a.b)*(a.a-c.a);
}

void add(line pre){
    v.push_back(pre);
    while (v.size()>=3 &&cal(v[v.size()-1],v[v.size()-2],v[v.size()-3]) ){
           v.erase(v.end()-2);
    }

}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    for (int i=1;i<=a;i++){
         cin >> z[i];
    }
    for (int i=1;i<=a;i++){
         int x;
         cin >> x;
         prefix[i]=prefix[i-1]+x;
    }
    v.push_back({-2*z[1],-prefix[1]+z[1]*z[1]});
    dp[1]=0;
    for (int i=2;i<=a;i++){
         int val=query(z[i])+z[i]*z[i]+prefix[i-1];
         dp[i]=val;
         line pre={-2*z[i],dp[i]+z[i]*z[i]-prefix[i]};
//         cout << dp[i] << " " << v.size() << "\n";
         add(pre);
    }
    cout << dp[a] << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...