Submission #1313033

#TimeUsernameProblemLanguageResultExecution timeMemory
1313033boclobanchatK blocks (IZhO14_blocks)C++20
53 / 100
1096 ms3448 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+5; const int INF=1e9; int seg[MAXN*4],A[MAXN],dp[MAXN],L[MAXN],R[MAXN],pre[MAXN]; stack<int> st; void build(int l,int r,int pos) { if(l==r) { seg[pos]=INF; return ; } int mid=(l+r)/2; build(l,mid,pos*2); build(mid+1,r,pos*2+1); seg[pos]=INF; } void update(int l,int r,int i,int val,int pos) { if(i<l||r<i) return ; if(l==r) { seg[pos]=val; return ; } int mid=(l+r)/2; update(l,mid,i,val,pos*2); update(mid+1,r,i,val,pos*2+1); seg[pos]=min(seg[pos*2],seg[pos*2+1]); } int get(int l,int r,int u,int v,int pos) { if(u<=l&&r<=v) return seg[pos]; int mid=(l+r)/2; if(v<=mid) return get(l,mid,u,v,pos*2); if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1); return min(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1)); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>A[i]; for(int i=1;i<=n;i++) { while(!st.empty()&&A[i]>A[st.top()]) st.pop(); if(st.empty()) L[i]=1; else L[i]=st.top()+1; st.push(i); } while(!st.empty()) st.pop(); for(int i=n;i;i--) { while(!st.empty()&&A[i]>=A[st.top()]) st.pop(); if(st.empty()) R[i]=n; else R[i]=st.top()-1; st.push(i); } for(int i=1;i<=n;i++) pre[i]=INF; for(int i=1;i<=k;i++) { build(0,n,1); dp[0]=INF; for(int j=1;j<=n;j++) { update(0,n,R[j-1],min(pre[j-1],get(0,n,R[j-1],R[j-1],1)),1); dp[j]=get(0,n,L[j]-1,n,1)+A[j]; } for(int j=0;j<=n;j++) pre[j]=dp[j]; } int ans=INF; for(int i=1;i<=n;i++) if(R[i]==n) ans=min(ans,dp[i]); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...