Submission #540179

#TimeUsernameProblemLanguageResultExecution timeMemory
540179xuliuBuilding Bridges (CEOI17_building)C++17
100 / 100
54 ms35524 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long 
#define ld long double 
#define debug if(0)
 
const ll inf = 1e18 + 4;

struct Line {
	ll a, b;
	Line(ll _a, ll _b) { a = _a; b = _b; }
	Line() { a = 0; b = inf; }
	ll operator()(ll x) { return a*x+b; }
};

struct segtree {
	int sz;
	vector<Line> seg;
	void init(int n) {
		sz = 1;
		while(sz < n) sz<<=1;
		seg.assign(2*sz+4, Line());
	}
	void add(Line line, int x, int lx, int rx) {
		int m = (lx+rx)/2;
		if(seg[x](m) > line(m)) swap(seg[x], line);
		if(lx == rx) return;
		if(line.a >= seg[x].a) add(line, 2*x, lx, m);
		else add(line, 2*x+1, m+1, rx);
	}
	void add(Line line) { add(line, 1, 0, sz-1); }
	ll get(ll x) {
		ll v = x, ret = inf;
		x += sz;
		while(x) {
			ret = min(ret, seg[x](v));
			x >>= 1;
		}
		return ret;
	}
};

const int N = 1e6 + 4;

/*
 * 
 * dp[i] = -wi + min(dp[j] + (hj-hi)^2) = -wi + min(dp[j] + hj^2 - 2hihj + hi^2) = -wi + hi^2 + min(dp[j]+hj^2-2hihj)
 * fj(x) = (dp[j]+hj^2) + (-2hj)*x
 * dp[i] = -wi+hi^2 + min(fj(hi)), for j < i
 * result = dp[n] + W, where W = sum of all wi 
 * 
 */

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n; cin>>n;
	vector<ll> w(n), h(n), dp(n, inf);
	segtree st; st.init(N);
	ll W  = 0;
	for(int i=0; i<n; i++) cin>>h[i];
	for(int i=0; i<n; i++) { cin>>w[i]; W += w[i]; }
	dp[0] = -w[0]; st.add(Line(-2LL*h[0], dp[0]+h[0]*h[0]));
	for(int i=1; i<n; i++) {
		dp[i] = -w[i] + h[i]*h[i] + st.get(h[i]);
		st.add(Line(-2LL*h[i], dp[i]+h[i]*h[i]));
	}
	cout<<dp[n-1]+W;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...