作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 50005;
#define int long long
int n, L, sum[N], f[N], q[N], tail = -1, head = 0;

/*
A(i) = i+sum[i]
B(i) = i+sum[i]+L+1
f[i] = f[j]+(A(i)-B(j))^2
*/
int A(int x) {
	return sum[x] + x;
}

int B(int x) {
	return sum[x] + x + L + 1;
}

int Y(int x) {
	return f[x] + B(x) * B(x);
}

int X(int x) {
	return B(x);
}

double K(int i, int j) {
	return double(Y(j) - Y(i)) / double(X(j) - X(i));
}

signed main() {
	cin >> n >> L;
	for (int i = 1; i <= n; i++) {
		cin >> sum[i];
		sum[i] += sum[i - 1];
	}
	q[++tail] = 0;
	for (int i = 1; i <= n; i++) {
		while (tail > head && K(q[head], q[head + 1]) < 2 * A(i))
			head++;
		int j = q[head];
		f[i] = f[j] + (A(i) - B(j)) * (A(i) - B(j));
		while (tail > head && K(i, q[tail - 1]) < K(q[tail], q[tail - 1]))
			--tail;
		q[++tail] = i;
	}
	cout << f[n] << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 5;
int n, s, T[N], sum[N], f[N];
int q[N], tail = -1, head = 0;

int X(int i) {
	return sum[i];
}

int Y(int i) {
	return f[i] - s * sum[i];
}

double K(int i, int j) {
	return double(Y(i) - Y(j)) / double(X(i) - X(j));
}

signed main() {
	cin >> n >> s;
	for (int i = 1; i <= n; i++) {
		cin >> T[i] >> sum[i];
		T[i] += T[i - 1];
		sum[i] += sum[i - 1];
	}
	q[++tail] = 0;
	for (int i = 1; i <= n; i++) {
		while (tail > head && K(q[head], q[head + 1]) < T[i])
			head++;
		int j = q[head];
		f[i] = f[j] + T[i] * (sum[i] - sum[j]) + s * (sum[n] - sum[j]);

		while (tail > head && K(i, q[tail - 1]) < K(q[tail], q[tail - 1]))
			--tail;
		q[++tail] = i;
	}
	cout << f[n] << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
#define int long long
int n, s, T[N], sum[N], f[N], stk[N], top;

int X(int i) {
	return sum[i];
}

int Y(int i) {
	return f[i] - s * sum[i];
}

double k(int i, int j) {
	return double(Y(i) - Y(j)) / double(X(i) - X(j));
}

int find(int i) {
	int l = 0, r = top - 1, res = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (T[i] * (X(stk[mid + 1]) - X(stk[mid])) < Y(stk[mid + 1]) - Y(stk[mid])) {
			res = mid;
			r = mid - 1;
		} else
			l = mid + 1;
	}
	if (res == -1)
		return stk[top];
	else
		return stk[res];
}

signed main() {
	cin >> n >> s;
	for (int i = 1; i <= n; i++) {
		cin >> T[i] >> sum[i];
		T[i] += T[i - 1];
		sum[i] += sum[i - 1];
	}
	//stk[++top] = 0;
	for (int i = 1; i <= n; i++) {
		int j = find(i);
		f[i] = f[j] + T[i] * (sum[i] - sum[j]) + s * (sum[n] - sum[j]);
		while (top && ((Y(i) - Y(stk[top])) * (X(i) - X(stk[top - 1]))) <= ((Y(i) - Y(stk[top - 1])) * (X(i) - X(stk[top]))))
			top--;
		stk[++top] = i;
	}
	cout << f[n]
	     << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n, c[N], x[N], sump[N], sumpx[N];
int q[N], tail, head;
int f[N];

int X(int i) {
	return sump[i];
}

int Y(int i) {
	return f[i] + sumpx[i];
}

double k(int x, int y) {
	return double(Y(y) - Y(x)) / double(X(y) - X(x));
}

signed main() {
	cin >> n;
	int id = 0;
	for (int i = 1; i <= n; i++) {
		int p;
		cin >> x[i] >> p >> c[i];
		if (p)
			id = i;
		sump[i] = sump[i - 1] + p;
		sumpx[i] = sumpx[i - 1] + p * x[i];
	}
	for (int i = 1; i <= n; i++) {
		while (tail > head && Y(q[head + 1]) - Y(q[head]) < x[i] * (X(q[head + 1]) - X(q[head])))
			head++;
		int j = q[head];
		f[i] = f[j] + c[i] + x[i] * (sump[i] - sump[j]) - sumpx[i] + sumpx[j];
		while (tail > head
		        && (Y(q[tail]) - Y(q[tail - 1])) * (X(i) - X(q[tail - 1])) > (Y(i) - Y(q[tail - 1])) * (X(q[tail]) - X(q[tail - 1])))
			--tail;
		q[++tail] = i;
	}
	int ans = 1999999999999999999;
	for (int i = id; i <= n; i++) {
		ans = min(ans, f[i]);
	}
	cout << ans << endl;
	return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
8
开始时间
2026-10-5 0:00
截止时间
2026-10-13 23:59
可延期
24 小时