제출 #1185835

#제출 시각아이디문제언어결과실행 시간메모리
1185835belgianbotBuilding Bridges (CEOI17_building)C++20
100 / 100
40 ms15312 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

struct f {
    int m, p;
    int calc(int x){return m * x + p;}
};

vector<int> cost, h, dp;
vector<f> li_chao;
int N;
const int maxN = 2e5;


void add_line(f nw, int i = 1, int l = 0, int r = maxN) {
    int mid = (l+r) / 2;
    bool better = nw.calc(l) < li_chao[i].calc(l);
    bool betterMid = nw.calc(mid) < li_chao[i].calc(mid);

    if (betterMid) swap(nw, li_chao[i]);
    
    if (l == r) return;
    else if (better != betterMid) add_line(nw, i * 2, l, mid);
    else add_line(nw, i * 2 + 1, mid+1, r);
}

int query (int x, int i = 1, int l = 0, int r = maxN) {
    int mid = (l+r)/2;
    if (l == r) return li_chao[i].calc(x);
    else if (x <= mid) return min(li_chao[i].calc(x), query(x, i * 2, l, mid));
    else return min(li_chao[i].calc(x), query(x, i*2+1, mid+1, r));
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> N;
    
    //f a = {0, (int)(1e9)};
    li_chao.resize(4*maxN, {0, (int)(1e32)}); h.resize(N); cost.resize(N);
    for (int i = 0; i < N; i++) cin >> h[i];
    for (int i = 0; i < N; i++) cin >> cost[i];

    dp.resize(N); dp[N-1] = 0;
    int sum = cost[N-1];
    add_line({-2*h[N-1], h[N-1] *h[N-1] - sum});
    for (int i = N - 2; i >= 0; i--) {
        int best = query(h[i]);
        dp[i] = best + h[i] * h[i] + sum;
        sum += cost[i];
        add_line({-2*h[i], h[i] * h[i] + dp[i] - sum});
        
    }

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