Submission #1261061

#TimeUsernameProblemLanguageResultExecution timeMemory
1261061kaiboyBuilding Bridges (CEOI17_building)C++20
100 / 100
85 ms2376 KiB
// coached by rainboy
#include <algorithm>
#include <iostream>

using namespace std;

const       int   N = 100000;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;

int aa[N], cc[N], ii0[N], ii1[N];
long long dp[N], xx[N];

__int128_t cross(long long x0, long long y0, long long x1, long long y1) {
	return (__int128_t) x0 * y1 - (__int128_t) x1 * y0;
}

__int128_t cross(int i, int j, int k) {
	long long xi = aa[i], yi = dp[i] + xi * xi;
	long long xj = aa[j], yj = dp[j] + xj * xj;
	long long xk = aa[k], yk = dp[k] + xk * xk;
	return cross(xj - xi, yj - yi, xk - xi, yk - yi);
}

long long calc(int i, int j) {
	return dp[i] + (long long) (aa[i] - aa[j]) * (aa[i] - aa[j]) - cc[j];
}

void solve(int l, int r) {
	if (r - l == 1)
		return;
	int m = l + r >> 1;
	solve(l, m);
	int k0 = 0;
	for (int i = l; i < m; i++)
		ii0[k0++] = i;
	sort(ii0, ii0 + k0, [] (int i, int j) { return aa[i] != aa[j] ? aa[i] < aa[j] : dp[i] < dp[j]; });
	int k0_ = 0;
	for (int h0 = 0; h0 < k0; h0++) {
		int i = ii0[h0];
		if (h0 && aa[i] == aa[ii0[h0 - 1]])
			continue;
		while (k0_ >= 2 && cross(ii0[k0_ - 2], ii0[k0_ - 1], i) <= 0)
			k0_--;
		ii0[k0_++] = i;
	}
	k0 = k0_;
	int k1 = 0;
	for (int i = m; i < r; i++)
		ii1[k1++] = i;
	sort(ii1, ii1 + k1, [] (int i, int j) { return aa[i] < aa[j]; });
	for (int h0 = 0, h1 = 0; h1 < k1; h1++) {
		int i = ii1[h1];
		while (h0 + 1 < k0 && calc(ii0[h0], i) > calc(ii0[h0 + 1], i))
			h0++;
		dp[i] = min(dp[i], calc(ii0[h0], i));
	}
	solve(m, r);
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n; cin >> n;
	for (int i = 0; i < n; i++)
		cin >> aa[i];
	for (int i = 0; i < n; i++)
		cin >> cc[i];
	for (int i = 1; i < n; i++)
		dp[0] += cc[i], dp[i] = INF;
	solve(0, n);
	cout << dp[n - 1] << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...