제출 #1313035

#제출 시각아이디문제언어결과실행 시간메모리
1313035boclobanchatK blocks (IZhO14_blocks)C++20
100 / 100
269 ms2960 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+5; const int INF=1e9; int fen[MAXN],A[MAXN],dp[MAXN],L[MAXN],R[MAXN],pre[MAXN]; stack<int> st; void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]=min(fen[i],val); } int get(int i) { int ans=INF;for(;i;i-=i&-i) ans=min(ans,fen[i]);return ans; } 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++) { for(int j=1;j<=n+1;j++) fen[j]=INF; dp[0]=INF; for(int j=1;j<=n;j++) { update(n+1-R[j-1],n+1,pre[j-1]); dp[j]=get(n+2-L[j])+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...