Submission #1288628

#TimeUsernameProblemLanguageResultExecution timeMemory
1288628Jawad_Akbar_JJBuilding Bridges (CEOI17_building)C++20
100 / 100
82 ms7448 KiB
#include <iostream>

using namespace std;
#define int long long
const int N = (1<<20) + 1;
int dp[N], m[N], c[N], Line[N<<1], pre[N], h[N];

int getVal(int id, int x){
	if (id == 0) return 1e17;
	return m[id] * x + c[id];
}

void insert(int id, int cur = 1, int st = 1, int en = N){
	bool A = getVal(id, st) < getVal(Line[cur], st), B = getVal(id, en - 1) < getVal(Line[cur], en - 1);
	if (Line[cur] == 0 or A + B == 2){
		Line[cur] = id;
		return;
	}
	if (A + B == 0)
		return;

	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	insert(id, lc, st, mid);
	insert(id, rc, mid, en);
}

int get(int i, int cur = 1, int st = 1, int en = N){
	if (en - st == 1)
		return getVal(Line[cur], i);
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;

	if (i < mid)
		return min(getVal(Line[cur], i), get(i, lc, st, mid));
	return min(getVal(Line[cur], i), get(i, rc, mid, en));
}

signed main(){
	int n;
	cin>>n;

	for (int i=1;i<=n;i++)
		cin>>h[i];

	for (int j=1;j<=n;j++)
		cin>>pre[j], pre[j] += pre[j-1];

	m[1] = -2 * h[1], c[1] = h[1] * h[1] - pre[1];
	insert(1);

	for (int i=2;i<=n;i++){
		dp[i] = get(h[i]) + pre[i-1] + h[i] * h[i];

		m[i] = -2 * h[i];
		c[i] = dp[i] + h[i] * h[i] - pre[i];

		insert(i);
	}
	cout<<dp[n]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...