Submission #162255

#TimeUsernameProblemLanguageResultExecution timeMemory
162255karmaBuilding Bridges (CEOI17_building)C++14
100 / 100
275 ms129160 KiB
#include <bits/stdc++.h>
#define pb          emplace_back
#define ll          long long
#define fi          first
#define se          second
#define mp          make_pair

using namespace std;

const int N = int(1e5) + 7;
const ll Cmax = (ll)1e18;
typedef pair<int, int> pii;

struct line {
    ll a, b;
    line (ll a = 0, ll b = Cmax): a(a), b(b) {}
    ll GetVal(ll x) {return a * x + b;}
};

struct TSegment {
    int l, r, mid;
    line cur;
    TSegment* left;
    TSegment* right;
    TSegment (int l = 0, int r = 0): l(l), r(r) {
        mid = (l + r) >> 1;
        cur = line();
        if(l == r) {
            left = right = NULL;
            return;
        }
        left = new TSegment(l, mid);
        right = new TSegment(mid + 1, r);
    }
    void Update(int x, int y, line val) {
        if(l > y || r < x) return;
        if(x <= l && r <= y) {
            ll lcur = cur.GetVal(l);
            ll rcur = cur.GetVal(r);
            ll lval = val.GetVal(l);
            ll rval = val.GetVal(r);
            if(lcur >= lval && rcur >= rval) {cur = val; return;}
            if(lcur <= lval && rcur <= rval) return;
            ll mval = val.GetVal(mid);
            ll mcur = cur.GetVal(mid);
            if(lcur >= lval && mcur >= mval) {
                right -> Update(x, y, cur);
                cur = val; return;
            }
            if(lcur <= lval && mcur <= mval) {
                right -> Update(x, y, val);
                return;
            }
            if(mcur >= mval && rcur >= rval) {
                left -> Update(x, y, cur);
                cur = val; return;
            }
            if(mcur <= mval && rcur <= rval) {
                left -> Update(x, y, val);
                return;
            }
        }
        left -> Update(x, y, val);
        right -> Update(x, y, val);
    }
    ll Query(int x) {
        if(l > x || r < x) return Cmax;
        ll res = cur.GetVal(x);
        if(l == r) return res;
        res = min(res, left -> Query(x));
        res = min(res, right -> Query(x));
        return res;
    }
};

int n;
ll w[N], h[N], f[N];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    #define Task        "test"
    if(fopen(Task".inp", "r")) {
        freopen(Task".inp", "r", stdin);
        freopen(Task".out", "w", stdout);
    }
    cin >> n;
    for(int i = 1; i <= n; ++i) cin >> h[i];
    for(int i = 1; i <= n; ++i) cin >> w[i], w[i] += w[i - 1];
    TSegment Min = TSegment(0, int(1e6));
    Min.Update(0, 1e6, line(-2 * h[1], f[1] - w[1] + h[1] * h[1]));
    for(int i = 2; i <= n; ++i) {
        f[i] = Min.Query(h[i]) + h[i] * h[i] + w[i - 1];
        Min.Update(0, 1e6, line(-2 * h[i], f[i] - w[i] + h[i] * h[i]));
    }
    cout << f[n];
}

Compilation message (stderr)

building.cpp: In function 'int main()':
building.cpp:84:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".inp", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
building.cpp:85:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".out", "w", stdout);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...