Submission #1259056

#TimeUsernameProblemLanguageResultExecution timeMemory
1259056paulcodeBuilding Bridges (CEOI17_building)C++17
100 / 100
30 ms7492 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 1e6 + 5; // cần +5 tránh lỗi biên
const ll INF = 1e18;

ll h[N], w[N], dp[N];

struct Line {
    ll a, b; // y = a*x + b
    Line(ll _a=0, ll _b=INF): a(_a), b(_b) {}
    ll operator()(ll x) const { return a * x + b; }
};

struct LiChao {
    struct Node {
        Line ln;
        Node *l, *r;
        Node(Line _ln): ln(_ln), l(nullptr), r(nullptr) {}
    };
    Node* root;
    ll L, R;
    LiChao(ll _L, ll _R) : root(nullptr), L(_L), R(_R) {}

    void add_line(Line nw){ add_line(root, L, R, nw); }
    ll query(ll x){ return query(root, L, R, x); }

    void add_line(Node* &nd, ll l, ll r, Line nw){
        if(!nd){ nd = new Node(nw); return; }
        ll mid = (l+r)>>1;
        bool lef = nw(l) < nd->ln(l);
        bool mdd = nw(mid) < nd->ln(mid);
        if(mdd) swap(nw, nd->ln);
        if(l == r) return;
        if(lef != mdd) add_line(nd->l, l, mid, nw);
        else add_line(nd->r, mid+1, r, nw);
    }

    ll query(Node* nd, ll l, ll r, ll x){
        if(!nd) return INF;
        ll res = nd->ln(x);
        if(l == r) return res;
        ll mid = (l+r)>>1;
        if(x <= mid) return min(res, query(nd->l, l, mid, x));
        else return min(res, query(nd->r, mid+1, r, x));
    }
};

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;
    for(int i=1;i<=n;i++) cin >> h[i];
    long long W = 0;
    for(int i=1;i<=n;i++){ cin >> w[i]; W += w[i]; }

    const ll XMAX = 1'000'000; // max h_i
    LiChao lichao(0, XMAX);

    dp[1] = -w[1]; 
    lichao.add_line({-2*h[1], dp[1] + h[1]*h[1]});

    for(int i=2;i<=n;i++){
        ll best = lichao.query(h[i]);
        dp[i] = (h[i]*h[i] - w[i]) + best;
        lichao.add_line({-2*h[i], dp[i] + h[i]*h[i]});
    }

    cout << dp[n] + W << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...