#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n, K;
vector<int> a;
vector<vector<int>> dp;
vector<vector<int>> st; // sparse table for RMQ
vector<int> logTable;
// Sparse Table for max
void buildSparseTable() {
int maxLog = log2(n) + 1;
st.assign(maxLog, vector<int>(n + 1));
logTable.resize(n + 1);
logTable[1] = 0;
for (int i = 2; i <= n; ++i)
logTable[i] = logTable[i / 2] + 1;
for (int i = 1; i <= n; ++i)
st[0][i] = a[i];
for (int k = 1; (1 << k) <= n; ++k) {
for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
st[k][i] = max(st[k - 1][i], st[k - 1][i + (1 << (k - 1))]);
}
}
}
int getMax(int l, int r) {
if (l > r) return 0;
int k = logTable[r - l + 1];
return max(st[k][l], st[k][r - (1 << k) + 1]);
}
void compute(int k, int l, int r, int optL, int optR) {
if (l > r) return;
int mid = (l + r) / 2;
pair<int, int> best = {INF, -1};
for (int j = optL; j <= min(mid - 1, optR); ++j) {
int cost = dp[k - 1][j] + getMax(j + 1, mid);
if (cost < best.first) {
best = {cost, j};
}
}
dp[k][mid] = best.first;
compute(k, l, mid - 1, optL, best.second);
compute(k, mid + 1, r, best.second, optR);
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> K;
a.resize(n + 1);
for (int i = 1; i <= n; ++i)
cin >> a[i];
buildSparseTable();
dp.assign(K + 1, vector<int>(n + 1, INF));
for (int i = 1; i <= n; ++i)
dp[1][i] = getMax(1, i);
for (int k = 2; k <= K; ++k)
compute(k, 1, n, 0, n - 1);
cout << dp[K][n] << '\n';
return 0;
}
# | 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... |