제출 #1171551

#제출 시각아이디문제언어결과실행 시간메모리
1171551AlgorithmWarriorK개의 묶음 (IZhO14_blocks)C++20
100 / 100
138 ms3228 KiB
#include <bits/stdc++.h> using namespace std; int const MAX=1e5+5; long long dp[MAX]; long long old_dp[MAX]; int n,k; int v[MAX]; void read(){ cin>>n>>k; int i; for(i=1;i<=n;++i) cin>>v[i]; } void minself(long long& x,long long val){ if(x>val) x=val; } struct structy{ int val; long long old,dp; }; void upgrade(){ int i; for(i=0;i<=n;++i) old_dp[i]=dp[i]; stack<structy>stv; for(i=1;i<=n;++i){ long long old=old_dp[i-1]; while(!stv.empty() && stv.top().val<=v[i]){ minself(old,stv.top().old); stv.pop(); } dp[i]=old+v[i]; if(!stv.empty()) minself(dp[i],stv.top().dp); stv.push({v[i],old,dp[i]}); } } int solve(){ dp[0]=1e18; dp[1]=v[1]; int i; for(i=2;i<=n;++i) dp[i]=max((int)dp[i-1],v[i]); for(i=2;i<=k;++i) upgrade(); return dp[n]; } int main() { read(); cout<<solve(); 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...