제출 #886948

#제출 시각아이디문제언어결과실행 시간메모리
886948alexddK개의 묶음 (IZhO14_blocks)C++17
100 / 100
144 ms126984 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n,k;
int a[100005];
deque<pair<int,int>> dq[100005];
int dp[100005];
signed main()
{
    cin>>n>>k;
    for(int i=0;i<=k;i++)
        dp[i]=-INF;
    int minpref=INF;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i] = 1000000000 - a[i];
        minpref = min(minpref, a[i]);
        for(int j=k;j>1;j--)
        {
            int mxm=-INF;
            while(!dq[j].empty() && a[i]<=dq[j].back().second)
            {
                mxm = max(mxm, dq[j].back().first - dq[j].back().second);
                dq[j].pop_back();
            }
            mxm = max(mxm, dp[j-1]);
            if(mxm!=-INF && (dq[j].empty() || mxm+a[i] > dq[j].back().first)) dq[j].push_back({mxm+a[i],a[i]});
            if(!dq[j].empty()) dp[j] = dq[j].back().first;
            else dp[j]=-INF;
        }
        dp[1] = minpref;
    }
    cout<<1000000000 * k - dp[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...