二分斜率优化全wa求助
查看原帖
二分斜率优化全wa求助
553459
Css_orz楼主2024/10/5 11:02
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;
ll n, l;
ll c[50001], dp[50001], v[50001], cnt = 1,x[50001],y[50001];
ll ti(ll z) {return z * z;}
ll check(ll k) {
	ll l = 1, r = cnt, mid = (l + r) >> 1;
	while (l <= r) {
		mid = (l + r) >> 1;
		ll L = v[mid], R = v[mid + 1];
		if (k * (x[R] - x[L]) > (y[R] - y[L]))l = mid + 1;
		else r = mid - 1;
	}
	return v[l];
}
int main() {
	cin >> n >> l;
	for (int i = 1; i <= n; i++) {
		cin >> c[i];
		c[i] += c[i - 1];
	}
	v[cnt] = 0;
	for (int i = 1; i <= n; i++) {
		ll j = check(2 * (i + c[i]));
		dp[i] = dp[j] + ti(i - j - 1 + c[i] - c[j] - l);
		x[i] = l + 1 + i + c[i];
		y[i] = dp[i] + ti(x[i]);
		while (cnt > 1) {
			if ((y[i]-y[v[cnt]])*(x[v[cnt]]-x[v[cnt-1]])< (x[i] - x[v[cnt]]) * (y[v[cnt]] - y[v[cnt - 1]])) {
				v[cnt] = 0;
				cnt--;
			}
			else break;
		}
		v[++cnt] = i;
		//cout<< dp[i] << " " << cnt << " " << x[i] << " " << y[i] << " " << j << "\n";
	}
	cout << dp[n];
}
2024/10/5 11:02
加载中...