Submission #531418

#TimeUsernameProblemLanguageResultExecution timeMemory
531418blueBuilding Bridges (CEOI17_building)C++17
100 / 100
58 ms36676 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
#define sz(x) int(x.size())

const int mxh = (1<<20);
const ll INF = 1'000'000'000'000'000'000LL;

struct segtree
{
	vll a = vll(mxh<<1, 0);
	vll b = vll(mxh<<1, INF);

	void addline(ll A, ll B, int i = 1, ll l = 0, ll r = 1'000'000)
	{
		if(A * l + B <= a[i] * l + b[i]  &&  A * r + B <= a[i] * r + b[i])
		{
			a[i] = A;
			b[i] = B;
			return;
		}

		if(A * l + B >= a[i] * l + b[i]  && A * r + B >= a[i] * r + b[i])
		{
			return;
		}

		ll m = (l+r)/2;


		if(A * l + B <= a[i] * l + b[i])
		{
			if(A * m + B <= a[i] * m + b[i])
			{
				addline(a[i], b[i], 2*i+1, m+1, r);
				a[i] = A;
				b[i] = B;
			}
			else
			{
				addline(A, B, 2*i, l, m);
			}
		}
		else
		{
			if(A * (m+1) + B <= a[i] * (m+1) + b[i])
			{
				addline(a[i], b[i], 2*i, l, m);
				a[i] = A;
				b[i] = B;
			}
			else
			{
				addline(A, B, 2*i+1, m+1, r);
			}
		}
	}

	ll query(ll x, int i = 1, ll l = 0, ll r = 1'000'000)
	{
		if(l == r) return a[i] * x + b[i];
		else if(x <= (l+r)/2) return min(a[i] * x + b[i], query(x, 2*i, l, (l+r)/2));
		else return min(a[i] * x + b[i], query(x, 2*i+1, (l+r)/2+1, r));
	}
};

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n;
	cin >> n;

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

	ll wsum[1+n];
	wsum[0] = 0;
	for(int i = 1; i <= n; i++)
	{
		cin >> wsum[i];
		wsum[i] += wsum[i-1];
	}

	ll dp[1+n];
	dp[1] = 0;

	segtree lct;

	lct.addline(-2 * h[1], dp[1] + h[1]*h[1] - wsum[1]);


	for(int i = 2; i <= n; i++)
	{
		dp[i] = h[i]*h[i] + wsum[i-1] + lct.query(h[i]);
		lct.addline(-2 * h[i], dp[i] + h[i]*h[i] - wsum[i]);
	}

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