Submission #1236263

#TimeUsernameProblemLanguageResultExecution timeMemory
1236263sg93Building Bridges (CEOI17_building)C++17
0 / 100
37 ms3396 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define int long long

struct line{
	ll a, b;
	line(){a = 0; b = 0;}
	line(ll a, ll b){
		this->a = a;
		this->b = b;
	}
	ll operator()(int x){
		return a * x + b;
	}
};

const int M = 1e9;

struct node {
    line tr;
    node *lpt, *rpt;

    node() : tr(0, LLONG_MAX), lpt(nullptr), rpt(nullptr) {}

    int divi (int a, int b) {
        return a / b - ((a ^ b) < 0 && a % b);
    }

    void update (line f, int l = -M, int r = M) {
        if (l == r) {
            tr = (f(l) < tr(l) ? f : tr);
            return;
        }
        int mid = divi(l + r, 2);
        if (f(mid) < tr(mid)) swap(tr, f);
        if (f.a > tr.a) {
            if (lpt == nullptr) lpt = new node(); 
            lpt->update(f, l, mid); 
        }
        if (f.a < tr.a) {
            if (rpt == nullptr) rpt = new node(); 
            rpt->update(f, mid + 1, r); 
        }
    }

    ll query (int pos, int l = -M, int r = M) {
        ll cur = tr(pos);
        int mid = divi(l + r, 2);
        if (l == r) return cur;
        if (pos <= mid)
            return min(cur, lpt == nullptr ? LLONG_MAX : lpt->query(pos, l, mid));
        else
            return min(cur, rpt == nullptr ? LLONG_MAX : rpt->query(pos, mid + 1, r));
    }
};

signed main() {
	ios::sync_with_stdio(0);cin.tie(0);
	int n; cin >> n;
	int h[n + 1], w[n + 1], s[n + 1];
	s[0] = 0;
	for(int i = 1; i <= n; i++) cin >> h[i];
	for(int i = 1; i <= n; i++){
		cin >> w[i];
		s[i] = s[i - 1] + w[i];
	}
	ll dp;
	node lich;
	lich.update(line(-2 * h[1], h[1] * h[1]));
	ll mn = LLONG_MAX;
	for(int i = 2; i <= n; i++){
		dp = h[i] * h[i] + lich.query(h[i]) + s[i - 1];
		lich.update(line(-2 * h[i], h[i] * h[i] - s[i] + dp));
	}
	cout << dp << " ";

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...