#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;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dp[i][0]=1e14;
}
// dp[0][1]=1e14;
for(int j=1;j<=k;j++)
{
int p=j%2;
for(int i=0;i<=n;i++)dp[i][p]=1e14;
vector<int> st_mx,st_dp;
vector<ll> ans;
st_mx.push_back(0);
st_dp.push_back(0);
ans.push_back(dp[0][p]);
for(int i=1;i<=n;i++)
{
// dp[i][p]=min( dp[i'][1-p] + max(a[i'+1 , i'+2 , .. , i]) ) 'i<i
while(st_mx.size()>1 and a[st_mx.back()]<=a[i])
{
st_mx.pop_back();
ans.pop_back();
}
// dp[i][p]=;
// auto it=lower_bound(begin(st_dp),end(st_dp),st_mx.back());
// cout<<"BACK "<<st_mx.back()<<endl;;
ll etx=dp[st_mx.back()][1-p];
// if(it!=end(st_dp))
// {
// etx=dp[*it][1-p];
// // spl=*it;
// }
st_mx.push_back(i);
ans.push_back(min(ans.back(),etx+a[i]));
// cout<<"Split for "<<i<<' '<<p<<' '<<' '<<etx<<' '<<a[i]<<' '<<ans.back()<<endl;;
dp[i][p]=ans.back();
// cout<<"dp[ "<<i<<" ][ "<<j<<" ] = "<<dp[i][p]<<endl;
while(st_dp.size()>0 and dp[st_dp.back()][1-p]>=dp[i][1-p])
{
st_dp.pop_back();
}
st_dp.push_back(i);
// cout<<"st_dp: ";
// for(auto x:st_dp)cout<<x<<' ';
// cout<<endl;
// cout<<"st_dp: ";
// for(auto x:st_dp)cout<<dp[x][1-p]<<' ';
// cout<<endl;
}
}
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... |