Submission #1227015

#TimeUsernameProblemLanguageResultExecution timeMemory
1227015Hamed_GhaffariBuilding Bridges (CEOI17_building)C++20
0 / 100
10 ms1604 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const ll inf = 1e18;

inline ll divf(ll a, ll b) {
    return a/b - ((a^b)<0 && a%b);
}

struct line {
    mutable ll m, c, p;
    bool operator<(const line &l) const { return m < l.m; }
    bool operator<(ll x) const { return p < x; }
};

struct cht : multiset<line, less<>> {
private:
    inline ll isect(iterator x, iterator y) {
        return divf(x->c-y->c, y->m-x->m);
    }
public:
    inline void add(ll m, ll c) {
        auto y = insert({m, c, inf}), x = y++;
        if(empty()) return;
        if(x!=begin() && y!=end() && isect(x, y)<=prev(x)->p) {
            erase(x);
            return;
        }
        while(y!=end()) {
            ll p = isect(x, y);
            if(p>=y->p) y = erase(y);
            else {
                x->p = p;
                break;
            }
        }
        if(x==begin()) return;
        y = x--;
        while(x!=begin() && isect(prev(x), y)<=prev(x)->p) {
            erase(x);
            x = prev(y);
        }
        x->p = isect(x, y);
    }
    inline ll get(ll x) {
        assert(!empty());
        auto it = lower_bound(x);
        return it->m*x + it->c;
    }
};

const int MXN = 1e5+5;

int n, h[MXN];
ll w[MXN], dp[MXN];
cht ds;

inline void add(int j) {
    ds.add(2*h[j], -(dp[j]+1ll*h[j]*h[j]-w[j]));
}

inline ll get(int i) {
    return -ds.get(h[i]) + 1ll*h[i]*h[i] + w[i-1];
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    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];
    add(1);
    for(int i=2; i<=n; i++) {
        dp[i] = get(i);
        add(i);
    }
    cout << dp[n] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...