Submission #1166779

#TimeUsernameProblemLanguageResultExecution timeMemory
1166779WarinchaiBuilding Bridges (CEOI17_building)C++20
0 / 100
43 ms9028 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
int h[100005];
int w[100005];
int sum[100005];
int querymode=0;
int inf=1e9;
struct line{
    mutable int m,c,p;
    line(int _m=0,int _c=0,int _p=0){
        m=_m,c=_c,p=_p;
    }
    friend bool operator<(line a,line b){
        return querymode?a.p<b.p:a.m>b.m;
    }
};
struct convexhull:multiset<line>{
    int div(int a,int b){
        if(a%b==0||(a^b)>=0)return a/b;
        return a/b-1;
    }
    bool isect(iterator a,iterator b){
        if(b==end())return a->p=inf,false;
        if(a->m==b->m)a->p=(a->c<b->c?inf:-inf);
        else a->p=div(b->c-a->c,a->m-b->m);
        return a->p>=b->p;
    }
    void add(line a){
        auto x=insert(a),y=next(x);
        while(isect(x,y))y=erase(y);
        if((y=x)!=begin()&&isect(--x,y))isect(x,erase(y));
        while((y=x)!=begin()&&isect(--x,y))isect(x,erase(y));
    }
    int query(int x){
        if(empty())return 0;
        querymode=1;
        auto ans=lower_bound(line(0,0,x));
        querymode=0;
        return ans->m*x+ans->c;
    }
}hull;
int32_t main(){
    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],sum[i]+=sum[i-1]+w[i];
    hull.insert(line(h[1],h[1]*h[1]-sum[1],0));
    int ans=0;
    for(int i=2;i<=n;i++){
        ans=hull.query(-2*h[i])+h[i]*h[i]-sum[i-1];
        hull.insert(line(h[i],ans+h[i]*h[i]+sum[i],0));
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...