Submission #1331772

#TimeUsernameProblemLanguageResultExecution timeMemory
1331772witek_cppBuilding Bridges (CEOI17_building)C++20
0 / 100
65 ms97492 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) int(a.size())
#define f(i, a, b) for (int i = a; i < b; i++)
#define rep(i, a) f(i, 0, a)
#define int ll
#define tv(a, x) for (auto& a : x)
#define DUZO 1000000000000000000LL
#define en "\n"
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) int(a.size())
#define f(i, a, b) for (int i = a; i < b; i++)
#define rep(i, a) f(i, 0, a)
#define int ll
#define tv(a, x) for (auto& a : x)
#define DUZO 1000000000000000000LL
#define en "\n"
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;

const int MAXH = 1000000;

struct linia {
    int a, b;
    int zcz(int x) {return a * x + b;}
};

vector<linia> tr(MAXH * 4);
vi ma_linie(MAXH * 4, 0);

void add(int v, int l, int r, linia nw) {
    if (!ma_linie[v]) {
        tr[v] = nw;
        ma_linie[v] = 1;
        return;
    }
    int mid = (l + r)/2;
    bool le = nw.zcz(l) < tr[v].zcz(l);
    bool sr = nw.zcz(mid) < tr[v].zcz(mid);

    if (sr) swap(tr[v], nw);

    if (l == r) return;
    if (le == sr) add(v * 2 + 1, mid + 1, r, nw);
    else add(v * 2, l, mid, nw);
}

int query(int v, int l, int r, int x) {
    if (!ma_linie[v]) return DUZO;
    int val = tr[v].zcz(x);
    if (l == r) return val;
    int mid = (l + r)/2;
    if (mid >= x) return min(val, query(v * 2, l, mid, x));
    else return min(val, query(v, mid + 1, r, x));
}

vi h;
vi w;
vi pref;
vi dp;

pii obl(int ind) {
    return {h[ind] * h[ind] - pref[ind] + dp[ind], -2*h[ind]};
}

void solve() {
    int n;
    cin >> n;
    h.resize(n);
    w.resize(n);
    f(i, 0, n) cin >> h[i];
    f(i, 0, n) cin >> w[i];
    w[0] = w.back() = 0;
    pref.resize(n);
    pref[0] = w[0];
    f(i, 1, n) pref[i] = pref[i - 1] + w[i];
    dp.resize(n);
    dp[0] = 0;
    pii p1 = obl(0);
    add(1, 0, MAXH, {p1.nd, p1.st});
    f(i, 1, n) {
        dp[i] = h[i] * h[i] + pref[i - 1] + query(1, 0, MAXH, h[i]);
        pii p1 = obl(i);
        add(1, 0, MAXH, {p1.nd, p1.st});
    }
    cout << dp.back() << en;
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...