Submission #152742

#TimeUsernameProblemLanguageResultExecution timeMemory
152742vexK blocks (IZhO14_blocks)C++14
53 / 100
1040 ms42876 KiB
#include<bits/stdc++.h> #define maxn 100005 #define INF (int)(1e9 + 77) using namespace std; int n,k; int a[maxn]; int dp[maxn][102]; int lv[maxn]; int tree[4*maxn]; void build(int v,int l,int r,int ind) { if(l>r)return; if(l==r) { tree[v]=dp[l][ind]; return; } int mid=(l+r)/2; build(2*v,l,mid,ind); build(2*v+1,mid+1,r,ind); tree[v]=min(tree[2*v],tree[2*v+1]); } int query(int v,int l,int r,int lt,int rt) { if(l>r || l>rt || lt>r)return INF; if(lt<=l && r<=rt)return tree[v]; int mid=(l+r)/2; return min(query(2*v,l,mid,lt,rt), query(2*v+1,mid+1,r,lt,rt)); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; stack<int>ms; ms.push(0); a[0]=INF; for(int i=1;i<=n;i++) { while(!ms.empty()) { int vrh=ms.top(); if(a[vrh]<=a[i]) { ms.pop(); } else break; } lv[i]=ms.top(); ms.push(i); } //for(int i=1;i<=n;i++)cout<<lv[i]<<" ";cout<<endl; for(int i=0;i<=n;i++) for(int j=0;j<=k;j++)dp[i][j]=INF; dp[0][0]=0; for(int i=1;i<=n;i++)dp[i][0]=INF; for(int j=1;j<=k;j++) { build(1,0,n,j-1); for(int i=1;i<=n;i++) { dp[i][j]=min( dp[ lv[i] ][j], query(1,0,n,lv[i],i-1)+a[i]); } } 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...