#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=1e9;
int fen[MAXN],A[MAXN],dp[MAXN],L[MAXN],R[MAXN],pre[MAXN];
stack<int> st;
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]=min(fen[i],val); }
int get(int i) { int ans=INF;for(;i;i-=i&-i) ans=min(ans,fen[i]);return ans; }
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];
for(int i=1;i<=n;i++)
{
while(!st.empty()&&A[i]>A[st.top()]) st.pop();
if(st.empty()) L[i]=1;
else L[i]=st.top()+1;
st.push(i);
}
while(!st.empty()) st.pop();
for(int i=n;i;i--)
{
while(!st.empty()&&A[i]>=A[st.top()]) st.pop();
if(st.empty()) R[i]=n;
else R[i]=st.top()-1;
st.push(i);
}
for(int i=1;i<=n;i++) pre[i]=INF;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n+1;j++) fen[j]=INF;
dp[0]=INF;
for(int j=1;j<=n;j++)
{
update(n+1-R[j-1],n+1,pre[j-1]);
dp[j]=get(n+2-L[j])+A[j];
}
for(int j=0;j<=n;j++) pre[j]=dp[j];
}
int ans=INF;
for(int i=1;i<=n;i++) if(R[i]==n) ans=min(ans,dp[i]);
cout<<ans;
}
| # | 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... |