제출 #540176

#제출 시각아이디문제언어결과실행 시간메모리
540176xuliuBuilding Bridges (CEOI17_building)C++17
100 / 100
111 ms28620 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; // ax + b
	Line() { a = 0; b = inf; }
	Line(ll _a, ll _b) { a = _a; b = _b; }
	ll operator()(ll x) { return a*x + b; }
};

const int N = 1e9 + 4;
int chg(int x) { return x-N; }
int chgg(int x) { return x+N; }

struct node {
	ll l, r;
	Line line;
	node *left = NULL, *right = NULL;
	node(int lb, int rb) {
		l = lb; r = rb;
	}
	void extend() {
		if(!left && l != r) {
			ll m = (l+r)/2;
			left = new node(l, m);
			right = new node(m+1, r);
		}
	}
	void add(Line seg) {
		debug cerr<<"adding seg.a = "<<seg.a<<", seg.b = "<<seg.b<<"\n";
		if(l == r) {
			if(seg(chg(l)) < line(chg(l))) line = seg;
			return;
		}
		extend();
		ll m = (l+r)/2;
		if(line.a < seg.a) swap(line, seg);
		if(line(chg(m)) > seg(chg(m))) {
			swap(line, seg);
			left->add(seg);
		}
		else right->add(seg);
	}
	ll get(ll x) {
		if(l == r) return line(chg(x));
		extend();
		int m = (l+r)/2;
		if(x <= m) return min(line(chg(x)), left->get(x));
		else return min(line(chg(x)), right->get(x));
	}
};

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n; cin>>n;
	node root(0, 2*N+4);
	vector<ll> h(n), w(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]; }
	vector<ll> dp(n, inf);
	dp[0] = -w[0];
	root.add(Line(-2LL*h[0], dp[0]+h[0]*h[0]));
	for(int i=1; i<n; i++) {
		dp[i] = h[i]*h[i] - w[i];
		dp[i] += root.get(chgg(h[i]));
		root.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...