Submission #173701

#TimeUsernameProblemLanguageResultExecution timeMemory
173701itglK blocks (IZhO14_blocks)C++14
100 / 100
631 ms43084 KiB
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
int n, k;
int a[100005];
int dp[100005][105];

int main(){
  cin >> n >> k;
  int sum=0;
  for(int i=1;i<=n;i++){
    cin >> a[i];
    sum+=a[i];

  }
  memset(dp,1e9+7,sizeof(dp));
  dp[0][1]=0;
  for(int i=1;i<=n;i++){
    dp[i][1]=max(dp[i-1][1],a[i]);
  }
  dp[0][1]=1e9+7;

  for(int i=2;i<=k;i++){
    stack<int> pval, val;
    for(int j=1;j<=n;j++){
      int x = dp[j-1][i-1];
      while(!pval.empty()&&a[pval.top()]<a[j]){
        x=min(x,val.top());
        pval.pop();
        val.pop();
      }

      if(pval.size()){
        dp[j][i]=dp[pval.top()][i];

      }
      pval.push(j);
      val.push(min(dp[j][i-1],x));

      dp[j][i]=min(dp[j][i],x+a[j]);

    }
  }

  cout << dp[n][k] << endl;
  return 0;
}
// 10 3 7 9 21 3 9 10 4
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...