Submission #1311475

#TimeUsernameProblemLanguageResultExecution timeMemory
1311475madamadam3Growing Vegetables is Fun 4 (JOI21_ho_t1)C++20
0 / 100
213 ms572 KiB
#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] ? x < y : f2[x] < f2[y];}); reverse(pos.begin(), pos.end()); int t = 0, s = 0, segments = 0; for (int j = 0; j < n; j++) { if (f2[j] > 0 && (j == 0 || f2[j-1] <= 0)) segments++; } int pv = -1; while (!pos.empty()) { int idx = pos.back(); int v = f2[idx] - s; if (f2[idx] != 0) { if (f2[idx] != pv) { t += segments * v; s += v; } bool L = idx > 0 && f2[idx-1] > f2[idx], R = idx < n-1 && f2[idx+1] > f2[idx]; if (!L && !R) segments--; else if (L && R) segments++; pv = f2[idx]; } 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...