# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1185846 | Celebi_276 | K blocks (IZhO14_blocks) | C++20 | 129 ms | 2960 KiB |
#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 15;
long long dp[N][2];
int a[N], n, k;
bool pre, cur;
int32_t main () {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i][1] = max(dp[i - 1][1], 1LL * a[i]);
}
dp[0][1] = 1E18;
pre = 1; cur = !pre;
for (int j = 2; j <= k; j++) {
for (int i = 0; i <= n; i++) dp[i][cur] = 0;
stack <pair <int, long long>> T;
for (int i = 0; i < j; i++) dp[i][cur] = 1e18;
for (int i = j; i <= n; i++) {
long long cur_mn = dp[i - 1][pre];
while (T.size() && a[T.top().first] <= a[i]) {
cur_mn = min(cur_mn, T.top().second);
T.pop();
}
dp[i][cur] = cur_mn + a[i];
if (T.size()) dp[i][cur] = min(dp[i][cur], dp[T.top().first][cur]);
T.emplace(i, cur_mn);
}
swap(cur, pre);
}
printf("%lld\n", dp[n][pre]);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |