제출 #694074

#제출 시각아이디문제언어결과실행 시간메모리
694074PoonYaPatBuilding Bridges (CEOI17_building)C++14
100 / 100
78 ms69492 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct line {
    ll slope,con;
} s[1<<22];

ll f(line a, ll x) {
    return a.slope*x+a.con;
}

int n,mx=1000000;
ll h[100001],w[100001],sum,dp[100001];

void add(line a, int l, int r, int idx) {
    int mid=(l+r)/2;
    bool m = f(a,mid) < f(s[idx],mid);
    bool lef = f(a,l) < f(s[idx],l);

    if (m) swap(s[idx],a);

    if (r-l==1) return;
    else if (lef!=m) add(a,l,mid,2*idx);
    else add(a,mid,r,2*idx+1);
}

ll query(int l, int r, int idx, int x) {
    int m=(l+r)/2;
    if (r-l==1) return f(s[idx],x);
    else if (x<m) return min(f(s[idx],x),query(l,m,2*idx,x));
    else return min(f(s[idx],x),query(m,r,2*idx+1,x));
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n;
    for (int i=1; i<=n; ++i) cin>>h[i];
    for (int i=1; i<=n; ++i) cin>>w[i], sum+=w[i];

    dp[1]=-w[1];
    for (int i=0; i<(1<<22); ++i) s[i]={-2*h[1],dp[1]+h[1]*h[1]};
    for (int i=2; i<=n; ++i) {
        dp[i]=query(0,mx,1,h[i])+h[i]*h[i]-w[i];
        add({-2*h[i],dp[i]+h[i]*h[i]},0,mx,1);
    }
    cout<<dp[n]+sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...