제출 #727639

#제출 시각아이디문제언어결과실행 시간메모리
727639NeroZeinBuilding Bridges (CEOI17_building)C++17
60 / 100
3082 ms7588 KiB
#include <bits/stdc++.h>
#define int long long 
using namespace std;
 
const int N = 100005;
const int M = 1000006;
 
struct Line {
	int m, b;
	Line () {}
	Line (int m_, int b_ ) : m(m_), b(b_) {}
	int val (int x) {
		return m * x + b; 
	}
};
 
int rt, idd; 
int L[N << 2], R[N << 2]; 
Line seg[N << 2];
 
inline void upd (int& nd, int l, int r, Line line) {
	if (nd == 0) {
		nd = ++idd;
		assert(nd < N * 4); 
		seg[nd] = line;
		return; 
	}
	int mid = (l + r) >> 1; 
	bool f1 = line.val(l) < seg[nd].val(l);
	bool f2 = line.val(mid) < seg[nd].val(mid); 
	if (f2) {
		swap(seg[nd], line);
	}
	if (f1 != f2) {
		return upd(L[nd], l, mid, line); 
	} else {
		return upd(R[nd], mid + 1, r, line); 
	}
}
 
inline int qry (int nd, int l, int r, int x) {
	int me = seg[nd].val(x);
	if (!nd) {
		return 1e18; 
	}
	if (l == r) {
		return me; 
	}
	int mid = (l + r) >> 1;
	if (x <= mid) {
		return min(me, qry(L[nd], l, mid, x));
	} else {
		return min(me, qry(R[nd], mid + 1, r, x)); 
	}
}
 
int n;
int h[N], w[N];
int pref[N]; 
int dp[N]; 
 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
	}
	for (int i = 1; i <= n; ++i) {
		cin >> w[i];
		pref[i] = pref[i - 1] + w[i];
	}
	upd(rt, 0, M, Line(-2 * h[1], h[1] * h[1] - pref[1]));
	for (int i = 2; i <= n; ++i) {
		dp[i] = h[i] * h[i] + pref[i - 1] + qry(rt, 0, M, h[i]);
		upd(rt, 0, M, Line(-2 * h[i], h[i] * h[i] - pref[i] + dp[i])); 
	}
	cout << dp[n] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...