Submission #1312605

#TimeUsernameProblemLanguageResultExecution timeMemory
1312605zangdoK blocks (IZhO14_blocks)C++20
0 / 100
1 ms576 KiB
/******************************************************************************

                              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;
int arr[MAXN] ,pos[MAXN],n,k;
long long dp[MAXN][MAXK], pref[MAXN];
stack <int> gay;

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=1 ;i<=n;i++){
        maxt=max(maxt, arr[i]);
        dp[i][1]=maxt;
        for(int j=1;j<=k;j++) if(j>i) dp[i][j]=1e18;
    }
    for (int i=1; i<=n;i++){
        for(int j=2; j<=k;j++){
            if(i<j) break;
            if(pos[i]<j-1) dp[i][j]= pref[j-1]+arr[i];
            else dp[i][j]= min(dp[pos[i]][j-1] + arr[i],dp[pos[i]][j]);
        }
    }
    //cout<<pos[6]<<endl;
    cout<<dp[n][k];
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...