Submission #1245247

#TimeUsernameProblemLanguageResultExecution timeMemory
1245247Mike_VuBuilding Bridges (CEOI17_building)C++17
0 / 100
36 ms17224 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double dou;
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
#define BITJ(x, j) (((x)>>(j))&1)
#define MASK(j) (1LL<<(j))
#define ALL(v) v.begin(), v.end()

template<typename T> bool maximize(T &x, const T &y) {
    if (x < y) {x = y; return 1;}
    return 0;
}
template<typename T> bool minimize(T &x, const T &y) {
    if (x > y) {x = y; return 1;}
    return 0;
}

struct Line{
    ll a, b;
    Line(ll _a = 0, ll _b = LLONG_MAX) {
        a = _a;
        b = _b;
    }
    ll cal(ll x) {
        return a*x+b;
    }
};
struct LICHAO{
    vector<Line> tr;
    void init(int sz) {
        tr.assign(sz+1, Line());
    }
    //id = mid
    void update(Line cur, int l, int r) {
        if (l > r) return;
        int mid = (l+r)>>1;
        if (tr[mid].cal(mid) > cur.cal(mid)) swap(tr[mid], cur);
        if (l == r) return;
        if (tr[mid].a < cur.a) {
            update(cur, l, mid-1);
        }
        if (tr[mid].a > cur.a) {
            update(cur, mid+1, r);
        }
    }
    ll query(ll x, int l, int r) {
        if (l > r) return LLONG_MAX;
        int mid = (l+r)>>1;
        ll val = tr[mid].cal(x);
        if (x == mid) return val;
        if (x < mid) return min(val, query(x, l, mid-1));
        if (x > mid) return min(val, query(x, mid+1, r));
    }
};

const int maxn = 1e5+5, maxval = 1e6+5;
int n, a[maxn];
ll ps[maxn];
LICHAO tr;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
//    #define name "task"
//    if (fopen(name".inp", "r")) {
//        freopen(name".inp", "r", stdin);
//        freopen(name".out", "w", stdout);
//    }
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    ps[0] = 0;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        ps[i] = ps[i-1]+x;
    }
    tr.init(maxval);
    //initiate state
    tr.update(Line(-2*a[1], (ll)a[1]*a[1]-ps[1]), 1, maxval);
    for (int i = 1; i <= n; i++) {
        ll dp = tr.query(a[i], 1, maxval)+(ll)a[i]*a[i]+ps[i-1];
        if (i == n) {
            cout << dp;
            return 0;
        }
        tr.update(Line(-2*a[i], (ll)a[i]*a[i]-ps[i]+dp), 1, maxval);
    }
}
/*
6
3 8 7 1 6 6
0 -1 9 1 2 0
*/

Compilation message (stderr)

building.cpp: In member function 'll LICHAO::query(ll, int, int)':
building.cpp:58:5: warning: control reaches end of non-void function [-Wreturn-type]
   58 |     }
      |     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...