제출 #1367041

#제출 시각아이디문제언어결과실행 시간메모리
1367041husseinjuanda수열 (APIO14_sequence)C++20
100 / 100
406 ms82624 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 5;
const long long NEG = -(1LL << 60);
long long dp[MAXN], dpbf[MAXN];
int wht[MAXN][205], pref[MAXN];
int n, k;
void dnc(int l, int r, int optl, int optr, int level){
    if(l > r) return;
    int best = optl, mid = (l + r) >> 1, lim = min(optr, mid - 1);
    long long xing = pref[n] - pref[mid], cur = NEG;
    for(int i = optl; i <= lim; i++){
        long long j = dpbf[i] + xing * 1LL * (pref[mid] - pref[i]);
        if(cur < j) cur = j, best = i;
    }
    dp[mid] = cur;
    wht[mid][level] = best;
    dnc(l, mid - 1, optl, best, level);
    dnc(mid + 1, r, best, optr, level);
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> k;
    for(int i = 0; i <= n; i++) dpbf[i] = NEG;
    for(int i = 0; i < n; i++){
        int x; cin >> x;
        pref[i + 1] = pref[i] + x;
    }
    dpbf[0] = 0;
    for(int i = 1; i <= k; i++){
        dnc(i, n - 1, i - 1, n - 2, i);
        for(int j = i; j <= n - 1; j++) dpbf[j] = dp[j];
    }
    long long mx = NEG;
    int it = 0;
    for(int i = k; i <= n - 1; i++){
        if(mx < dpbf[i]) mx = dpbf[i], it = i;
    }
    cout << mx << "\n";
    vector<int> j;
    for(int i = k; i >= 1; i--){
        j.push_back(it);
        it = wht[it][i];
    }
    reverse(j.begin(), j.end());
    for(auto i : j) cout << i << " ";
    cout << "\n";
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…