/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 +5;
const int MAXK = 105;
const long long INF = 1e12;
int arr[MAXN] ,pos[MAXN],n,k;
long long dp[MAXN][MAXK], pref[MAXN];
stack <int> gay;
stack <pair<int,long long> > dcm;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
//freopen("blocks.in", "r", stdin);
//freopen("blocks.out", "w", stdout);
cin>>n>>k;
for(int i=1; i<=n;i++) {cin>>arr[i]; pref[i]=pref[i-1]+arr[i];}
for(int i=n; i>=1; i--){
while(!gay.empty()){
if(arr[i]>arr[gay.top()]) {pos[gay.top()]= i;gay.pop();}
else break;
}
gay.push(i);
}
int maxt=-1;
for(int i=0 ;i<=n;i++){
for(int j=0; j<=k; j++){
if(j>i) dp[i][j]= INF;
}
}
for(int i=1 ; i<=n;i++) {maxt=max(arr[i],maxt); dp[i][1]=maxt;}
for (int j=2; j<=k;j++){
while(!dcm.empty()) dcm.pop();
for(int i=1; i<=n;i++){
if(j>i) continue;
long long vcl = dp[i-1][j-1];
while(!dcm.empty()){
pair <int, long long> chimbe = dcm.top();
if(arr[i]>=arr[chimbe.first]) {vcl = min(vcl, chimbe.second); dcm.pop();}
else break;
}
dcm.push({i, vcl});
dp[i][j]= min(dp[pos[i]][j], vcl+arr[i]);
//if(i==3&&j==3 ) cout<<dp[2][2]<<endl;
}
}
//cout<<pos[6]<<endl;
cout<<dp[n][k];
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... |