# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
5737 | 2014-05-15T02:33:54 Z | kriii | K개의 묶음 (IZhO14_blocks) | C++ | 0 ms | 0 KB |
#include <stdio.h> int N,K,A[100001],prv[100001],nxt[100001]; int P[100001],Q[100001],sz; int main() { scanf ("%d %d",&N,&K); for (int i=1;i<=N;i++){ scanf ("%d",&A[i]); prv[i] = 0x3fffffff; } while (K--){ P[0] = 0; Q[0] = 0x3fffffff; sz = 0; nxt[0] = 0x3fffffff; for (int i=1;i<=N;i++){ int last = prv[i-1]; while (Q[sz] <= A[i]){ if (last > P[sz]) last = P[sz]; sz--; } if (P[sz] + Q[sz] > last + A[i]){ sz++; P[sz] = last; Q[sz] = A[i]; } nxt[i] = P[sz] + Q[sz]; } for (int i=0;i<=N;i++) prv[i] = nxt[i]; } printf ("%d\n",prv[N]); return 0; }x