제출 #1368856

#제출 시각아이디문제언어결과실행 시간메모리
1368856norrawichzzz수열 (APIO14_sequence)C++20
71 / 100
217 ms196608 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const long long INF = 1e18;

const int N = 1e5+5, K=201;
long long dp[K][N], par[K][N], a[N], p[N];

int n,k;

void dac(int k, int l, int r, int optl, int optr) {
    if (l>r) return;

    long long optval = -1;
    int optk = -1;

    int mid=(l+r)/2;

    for (int i=optl; i<min(mid, optr+1); i++) {
        long long val = dp[k-1][i] + (p[mid]-p[i])*(p[n]-p[mid]);
        if (val >= optval) {
            optk = i;   
            optval = val;
        }
    }
    dp[k][mid] = optval;
    par[k][mid] = optk;
    
    dac(k, l, mid-1, optl, optk);
    dac(k, mid+1, r, optk, optr);
}

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);
    cin>> n>> k;

    for (int i=1; i<=n; i++) cin>> a[i], p[i] = p[i-1]+a[i];

    for (int i=1; i<=n; i++) dp[0][i] = -1;

    for (int t=1; t<=k; t++) {
        dac(t,1, n, 0, n);
    }

    long long ans = -1;
    int id = n, cur=k;
    for (int i=1; i<n; i++) {
        if (ans <= dp[k][i]) {
            ans = dp[k][i];
            id = i;
        }
    }

    vector<int> pos;

    while (cur>0) {
        int idx = par[cur][id];
        pos.push_back(id);
        id = idx;
        cur--;
    }   
    reverse(pos.begin(), pos.end());

    cout<< ans<< '\n';
    for (auto &x : pos) cout<< x<< ' ';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…