Submission #1026028

#TimeUsernameProblemLanguageResultExecution timeMemory
1026028vjudge1K blocks (IZhO14_blocks)C++17
53 / 100
1061 ms178512 KiB
#include "bits/stdc++.h" using namespace std; //#define int int64_t #define pb push_back const int lim=2e5+100; int mod=1e9+7; const int inf=INT_MAX; using pii=pair<int,int>; signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Local freopen(".in","r",stdin);freopen(".out","w",stdout); #endif int n,k; cin>>n>>k; int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; } int dp[k+1][n]; dp[1][0]=a[0]; for(int i=1;i<n;i++){ dp[1][i]=max(dp[1][i-1],a[i]); } if(k==1){ cout<<dp[1][n-1]; return 0; } int val[k+1][n]; vector<int>stk; stk.pb(-1); multiset<int>goodvals[k+1]; for(int i=0;i<=k;i++){ goodvals[i].insert(inf); } for(int i=0;i<n;i++){ for(int j=2;j<=k;j++){ if(i)val[j][i]=dp[j-1][i-1]; else val[j][i]=inf; } while(stk.back()!=-1&&a[stk.back()]<a[i]){ for(int j=2;j<=k;j++){ if(val[j][stk.back()]!=inf){ val[j][i]=min(val[j][i],val[j][stk.back()]-a[stk.back()]); goodvals[j].erase(goodvals[j].find(val[j][stk.back()])); } } stk.pop_back(); } for(int j=2;j<=k;j++){ if(val[j][i]!=inf){ val[j][i]+=a[i]; goodvals[j].insert(val[j][i]); } } for(int j=2;j<=k;j++){ dp[j][i]=*goodvals[j].begin(); } stk.pb(i); } cout<<dp[k][n-1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...