Submission #1118523

#TimeUsernameProblemLanguageResultExecution timeMemory
1118523IcelastBuilding Bridges (CEOI17_building)C++17
100 / 100
77 ms13276 KiB
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
// line add min get, returns INF if no line added

template <class T>
struct LiChao {
    const T INF = numeric_limits<T>::max() / 2;

    int C;
    vector<T> dom;
    vector<array<T, 2>> first;
    vector<int> label;

    T f(array<T, 2> p, int x) {
        return p[0] * dom[x] + p[1];
    }

    LiChao(vector<T> _dom) : dom(_dom) {
        sort(dom.begin(), dom.end());
        dom.resize(unique(dom.begin(), dom.end()) - dom.begin());
        C = dom.size();
        first.resize(4 * C, {0, INF});
        label.resize(4 * C, -1);
    }

    void add(T a, T b, int lab) {
        array<T, 2> p{a, b};
        int idx = 0, l = 0, r = C;
        while (l < r) {
            int m = (l + r) >> 1;
            bool doml = f(p, l) < f(first[idx], l);
            bool domm = f(p, m) < f(first[idx], m);
            if (domm) swap(p, first[idx]), swap(label[idx], lab);
            if (l + 1 == r) break;
            if (doml != domm) idx = 2 * idx + 1, r = m;
            else idx = 2 * idx + 2, l = m;
        }
    }

    pair<T, int> getMin(T x) {
//        x -= 1e-9;
        x = lower_bound(dom.begin(), dom.end(), x) - dom.begin();
        T mn = INF;
        int lab = -1;
        int idx = 0, l = 0, r = C;
        while (l < r) {
            if (f(first[idx], x) < mn) mn = f(first[idx], x), lab = label[idx];
            if (l + 1 == r) break;
            int m = (l + r) >> 1;
            if (x < m) idx = 2 * idx + 1, r = m;
            else idx = 2 * idx + 2, l = m;
        }
        return make_pair(mn, lab);
    }
};
void solve(){
    int n;
    cin >> n;
    vector<ll> h(n+1), w(n+1);
    for(int i = 1; i <= n; i++){
        cin >> h[i];
    }
    ll tot = 0;
    for(int i = 1; i <= n; i++){
        cin >> w[i];
        tot += w[i];
    }
    vector<ll> dom;
    for(int i = 1; i <= n; i++){
        dom.push_back(h[i]);
    }
    LiChao<ll> T(dom);
    vector<ll> f(n+1, 0);
    f[1] = -w[1];
    T.add(-h[1]*2, f[1]+h[1]*h[1], 1);
    for(int i = 2; i <= n; i++){
        f[i] = T.getMin(h[i]).first + h[i]*h[i] - w[i];
        T.add(-h[i]*2, f[i]+h[i]*h[i], i);
    }
    cout << f[n]+tot;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    //freopen("main.inp", "r", stdin);
    //freopen("main.out", "w", stdout);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...