Submission #308894

#TimeUsernameProblemLanguageResultExecution timeMemory
308894dangle1907K blocks (IZhO14_blocks)C++14
0 / 100
1 ms384 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define fi first #define se second const int MAXN=1+1e5; const int inf=1+1e9; LL n,k,f[110][MAXN],a[MAXN]; deque<pair<LL,LL> > q; int main() { #define TASK "ABC" //freopen(TASK ".inp","r",stdin); //freopen(TASK ".out","w",stdout); ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>k; for(int i=1; i<=n; ++i) { cin>>a[i]; } for(int i=1; i<=k; ++i) { for(int j=0; j<=n; ++j) { f[i][j]=inf; } } f[1][0]=0; for(int i=1; i<=n; ++i) f[1][i]=max(f[1][i-1],a[i]); for(int i=2; i<=k; ++i) { q.clear(); for(int j=i; j<=n; ++j) { LL minf=f[i-1][j-1]; while(!q.empty()&&a[j]>=a[q.back().se]) { minf=min(minf,q.back().fi); q.pop_back(); } //if(q.empty()) f[i][j]=min(f[i][0],minf+a[j]); //else f[i][j]=min(f[i][q.back().se],minf+a[j]); f[i][j]=min(f[i][j],minf+a[j]); q.push_back({minf,j}); //cout<<i<<' '<<j<<' '<<minf<<' '<<f[i][j]<<endl; } } cout<<f[k][n]; 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...