作业介绍
#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 小时