#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int MAXN = 1e5 + 5;
constexpr int MAXM = 1e5 + 5;
constexpr long double eps = 1e-8;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;
int n, m, p, now;
int d[MAXN], h[MAXN], t[MAXN], s[MAXN];
int f[MAXM][MAXN];
int x(int i) {
return i;
}
int y(int i) {
return s[i] + f[now - 1][i];
}
int k(int i) {
return t[i];
}
long double slope(int i, int j) {
return (long double)1 * (y(j) - y(i)) / (x(j) - x(i));
}
int q[MAXN], hed, tal;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m >> p;
for (int i = 2; i <= n; i++) {
cin >> d[i];
d[i] += d[i - 1];
}
for (int i = 1; i <= m; i++) {
cin >> h[i] >> t[i];
t[i] -= d[h[i]];
}
sort(t + 1, t + n + 1);
for (int i = 1; i <= m; i++) {
s[i] = s[i - 1] + t[i];
}
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= p; i++) {
hed = tal = 1;
for (int j = 1; j <= m; j++) {
while (hed < tal && slope(q[hed], q[hed + 1]) - eps <= k(j))
hed++;
int pos = q[hed];
f[i][j] = min(f[i - 1][j], y(pos) + k(j) * (j - pos) - s[j]);
if (y(j) >= INF)
continue;
while (hed < tal && slope(q[tal], j) - eps <= slope(q[tal], q[tal - 1]))
tal--;
q[++tal] = j;
}
}
cout << f[p][m] << endl;
return 0;
}
错误信息
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int MAXN = 1e5 + 5;
constexpr int MAXM = 1e5 + 5;
constexpr long double eps = 1e-8;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;
int n, m, p, now;
int d[MAXN], h[MAXN], t[MAXN], s[MAXN];
int f[MAXM][MAXN];
int x(int i) {
return i;
}
int y(int i) {
return s[i] + f[now - 1][i];
}
int k(int i) {
return t[i];
}
long double slope(int i, int j) {
return (long double)1 * (y(j) - y(i)) / (x(j) - x(i));
}
int q[MAXN], hed, tal;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m >> p;
for (int i = 2; i <= n; i++) {
cin >> d[i];
d[i] += d[i - 1];
}
for (int i = 1; i <= m; i++) {
cin >> h[i] >> t[i];
t[i] -= d[h[i]];
}
sort(t + 1, t + n + 1);
for (int i = 1; i <= m; i++) {
s[i] = s[i - 1] + t[i];
}
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= p; i++) {
hed = tal = 1;
for (int j = 1; j <= m; j++) {
while (hed < tal && slope(q[hed], q[hed + 1]) - eps <= k(j))
hed++;
int pos = q[hed];
f[i][j] = min(f[i - 1][j], y(pos) + k(j) * (j - pos) - s[j]);
if (y(j) >= INF)
continue;
while (hed < tal && slope(q[tal], j) - eps <= slope(q[tal], q[tal - 1]))
tal--;
q[++tal] = j;
}
}
cout << f[p][m] << endl;
return 0;
}