제출 #5789

#제출 시각아이디문제언어결과실행 시간메모리
5789tncks0121Split the sequence (APIO14_sequence)C++98
0 / 100
0 ms81564 KiB
#include <stdio.h>
#include <algorithm>
#define M 100009
using namespace std;
 
int n, k,path[200][M];
long long int d[2][M],ans,s[M];
 
long long int f(int j, int r){
    return d[0][r] + (s[n] - s[j])*(s[j] - s[r]);
}
int main(){
    int i, j;
    scanf("%d %d", &n, &k);
    for (i = 1; i <= n; i++) scanf("%lld", &s[i]);
    for (i = 1; i <= n; i++) s[i] = s[i - 1] + s[i];
 
    int pivot;
    for (i = 1; i <= k; i++){
        pivot = 0;
        for (j = k; j <= n; j++){
            while (s[j] >= (s[n] + s[pivot])/2 && f(j, pivot) <= f(j, pivot + 1) && pivot < j-1) pivot++;
            d[1][j] = f(j, pivot);
            path[i][j] = pivot;
        }
        for (j = 1; j <= n; j++) d[0][j] = d[1][j];
    }
 
    for (j = k; j <= n; j++) ans = max(ans, d[1][j]);
    printf("%lld\n", ans);
 
    for (j = k; j <= n; j++){
        if (ans == d[1][j]){
            int temp = j;
            for (i = k; i >= 1; i--){
                s[i] = temp;
                temp = path[i][temp];
            }
            break;
        }
    }
    for (i = 1; i <= k; i++) printf("%lld ", s[i]);
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...