#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100100;
ll a[N];
ll dp[N][3];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
dp[0][0]=dp[0][1]=1e14;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dp[i][0]=1e14;
dp[i][1]=a[i];
if(i>1)dp[i][1]=max(dp[i-1][1],a[i]);
}
for(int j=2;j<=k;j++)
{
int p=j%2;
for(int i=0;i<=n;i++)dp[i][p]=1e14;
vector<int> st_mx;
vector<ll> ans;
for(int i=1;i<=n;i++)
{
// dp[i][p]=min( dp[i'][1-p] + max(a[i'+1 , i'+2 , .. , i]) ) 'i<i
ll mi=dp[i-1][1-p]; // we always take this
while(st_mx.size()>0 and a[st_mx.back()]<a[i])
{
st_mx.pop_back();
mi=min(mi,ans.back());
ans.pop_back();
}
if(st_mx.size()==0 or a[st_mx.back()]+ans.back()>a[i]+mi)
{
st_mx.push_back(i);
ans.push_back(mi);
}
if(i>=j)
{
dp[i][p]=a[st_mx.back()]+ans.back();
}
}
}
cout<<dp[n][k%2]<<endl;
}
| # | 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... |