제출 #720474

#제출 시각아이디문제언어결과실행 시간메모리
720474joelgun14수열 (APIO14_sequence)C++17
0 / 100
77 ms131072 KiB
#include <bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std;
ll dp[100005][2];
int pr[100005][205];
ll pref[100005];
int n;
void dnc(int depth, int l, int r, int optl, int optr) {
    int optc = 0, mid = (l + r) / 2;
    ll optres = 0;
    for(int i = min(optl, mid - 1); i <= min(optr, mid - 1); ++i) {
        ll cur = (pref[mid] - pref[i]) * (pref[n] - pref[mid]) + dp[i][(depth & 1) ^ 1];
        if(cur > optres)
            optc = i, optres = cur;
    }
    dp[mid][depth & 1] = optres;
    pr[mid][depth] = optc;
    if(l != r) {
        dnc(depth, l, mid - 1, optl, optc);
        dnc(depth, mid + 1, r, optc, optr);
    }
}
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int k;
    cin >> n >> k;
    int a[n + 1];
    for(int i = 1; i <= n; ++i)
        cin >> a[i], pref[i] = pref[i - 1] + a[i];
    for(int i = 1; i <= n; ++i)
        dp[i][1] = pref[i] * (pref[n] - pref[i]);
    for(int i = 2; i <= k; ++i)
        dnc(i, 1, n, 0, n - 1);
    ll res = 0;
    int res_idx = 0;
    for(int i = 1; i <= n; ++i) {
        if(dp[i][k & 1] > res)
            res_idx = i, res = dp[i][k & 1];
    }
    cout << res << endl;
    vector<int> ans;
    int idx2 = k;
    while(idx2) {
        ans.push_back(res_idx);
        res_idx = pr[res_idx][idx2];
        --idx2;
    }
    reverse(ans.begin(), ans.end());
    for(auto i : ans)
        cout << i << " ";
    cout << endl;
    // splittingnya terurut dr awal sampai akhir
    // pake alien trick terus dp cht?
    // dp O(NKlogN)
}
#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...