#include <bits/stdc++.h>
using namespace std;
#define int long long int
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n; cin >> n;
vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i];
vector<int> f(n), r(n);
f[0] = r[n-1] = 0;
for (int i = 1; i < n; i++) {
int dx = (a[i-1] + f[i-1] + 1) - (a[i]);
f[i] = max(0LL, dx);
int dy = (a[n-i] + r[n-i] + 1) - (a[n-i-1]);
r[n-i-1] = max(0LL, dy);
}
vector<int> DP1(n+1, 0);
for (int i = 0; i <= n; i++) {
vector<int> f2(n); for (int j = 0; j < n; j++) f2[j] = (j <= i ? f[j] : r[j]);
if (i<n && a[i] + f2[i] <= a[i+1] + f2[i+1]) f2[i] += (a[i+1] + f2[i+1] + 1) - (a[i] + f2[i]);
vector<int> pos(n); iota(pos.begin(), pos.end(), 0); sort(pos.begin(), pos.end(), [&](int x, int y) {return f2[x] < f2[y];});
reverse(pos.begin(), pos.end());
int t = 0, s = 0, segments = 1;
int pv = -1;
while (!pos.empty()) {
int v = f2[pos.back()] - s;
if (f2[pos.back()] != pv) {
segments = 0;
for (int j = 0; j < n; j++) {
if (f2[j] - s > 0 && (j == 0 || f2[j-1] - s <= 0)) segments++;
}
t += segments * v;
s += v;
}
pv = f2[pos.back()];
pos.pop_back();
}
int p1 = 0, p2 = 0;
for (int j = 0; j < n; j++) {
if (j < i) p1 = max(p1, f2[j]);
else if (j > i) p2 = max(p2, f2[j]);
}
DP1[i] = t - min(p1, p2);
}
cout << *min_element(DP1.begin(), DP1.end());
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |