제출 #7151

#제출 시각아이디문제언어결과실행 시간메모리
7151baneling100K blocks (IZhO14_blocks)C++98
100 / 100
192 ms3148 KiB
#include <stdio.h>
#include <vector>
#define INF 0x7fffffff

using namespace std;

typedef pair <int,int> ppair;
vector <ppair> S;
int N, K, A[100001], D[2][100001];

void input(void)
{
    int i;

    scanf("%d %d",&N,&K);
    for(i=1 ; i<=N ; i++)
        scanf("%d",&A[i]);
}

void process(void)
{
    int i, j, x, y;

    for(i=1 ; i<=N ; i++)
    {
        D[1][i]=D[1][i-1];
        if(D[1][i]<A[i])
            D[1][i]=A[i];
    }
    for(i=2 ; i<=K ; i++)
    {
        S.clear();
        for(j=i ; j<=N ; j++)
        {
            y=D[1-(i%2)][j-1];
            while(!S.empty() && S.back().first<=A[j])
            {
                if(y>S.back().second)
                    y=S.back().second;
                S.pop_back();
            }
            if(S.empty())
                x=INF;
            else
                x=S.back().first+S.back().second;
            if(x>A[j]+y)
            {
                x=A[j]+y;
                S.push_back(make_pair(A[j],y));
            }
            D[i%2][j]=x;
        }
    }
}

void output(void)
{
    printf("%d",D[K%2][N]);
}

int main(void)
{
    input();
    process();
    output();

    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...