제출 #858371

#제출 시각아이디문제언어결과실행 시간메모리
858371Tenis0206Building Bridges (CEOI17_building)C++11
100 / 100
53 ms67320 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int nmax = 1e5;
const int hmax = 1e6;
const int oo = LLONG_MAX;

int n;
int h[nmax + 5], w[nmax + 5];
int sp[nmax + 5];

int dp[nmax + 5];

pair<int,int> lc[4 * hmax + 5];

int get_val(pair<int,int> f, int x)
{
    if(f.first==oo)
    {
        return oo;
    }
    return f.first * x + f.second;
}

bool is_smaller(pair<int,int> f, pair<int,int> g, int x)
{
    return get_val(f, x) < get_val(g, x);
}

int query(int poz, int nod, int st, int dr)
{
    if(st==dr)
    {
        return get_val(lc[nod], poz);
    }
    int mij = (st + dr) >> 1;
    if(poz <= mij)
    {
        return min(get_val(lc[nod],poz), query(poz,nod*2,st,mij));
    }
    return min(get_val(lc[nod],poz), query(poz,nod*2+1,mij+1,dr));
}

void update(pair<int,int> f, int nod, int st, int dr)
{
    int mij = (st + dr) >> 1;
    bool okst = is_smaller(f, lc[nod], st);
    bool okmij = is_smaller(f, lc[nod], mij);
    if(okmij)
    {
        swap(f,lc[nod]);
    }
    if(st==dr)
    {
        return;
    }
    if(okst!=okmij)
    {
        update(f,nod*2,st,mij);
    }
    else
    {
        update(f,nod*2+1,mij+1,dr);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    #ifdef home
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
    #endif // home
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>h[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>w[i];
        sp[i] = sp[i - 1] + w[i];
    }
    for(int i=1;i<=4*hmax;i++)
    {
        lc[i] = {oo,oo};
    }
    dp[1] = 0;
    update({-2 * h[1],dp[1] + 1LL * h[1] * h[1] - sp[1]},1,1,hmax);
    for(int i=2;i<=n;i++)
    {
        dp[i] = query(h[i],1,1,hmax) + 1LL * h[i] * h[i] + sp[i - 1];
        update({-2 * h[i],dp[i] + 1LL * h[i] * h[i] - sp[i]},1,1,hmax);
    }
    cout<<dp[n]<<'\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...