#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n, k;
cin >> n >> k;
int inf = 1e15;
vector<vector<int>> dp( n + 1, vector<int> (k+1, inf));
vector<int> a(n+1);
dp[0][1] = dp[1][1] = 0;
for(int i = 1; i <= n; i++){
cin >> a[i];
dp[i][1] = max(dp[i-1][1], a[i]);
}dp[0][1] = inf;
for(int j = 2; j <= k; j ++ ){
vector<array<int,2>> v;
for(int i = 1; i <= n; i++){
int mn = dp[i-1][j-1];
while(v.size() && v.back()[0] <= a[i]) {
mn = min(mn, v.back()[1]);
v.pop_back();
};
if(v.empty() || v.back()[0] + v.back()[1] <= mn + a[i]) v.push_back({a[i], mn});
dp[i][j] = mn + a[i];
if(v.size())dp[i][j] = min(dp[i][j], v.back()[0] + v.back()[1] );
}
}
for(int j = 1; j <= k; j ++ ) {
for(int i = 1; i <= n; i++)cout << dp[i][j] << ' ';
cout << '\n';
}
cout << dp[n][k] << '\n';
};
# | 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... |