Submission #1366086

#TimeUsernameProblemLanguageResultExecution timeMemory
1366086AzeTurk810Split the sequence (APIO14_sequence)C++20
100 / 100
671 ms81804 KiB
/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

using ll = long long;
using namespace std;

#define ln '\n'
#define INFi 1e9
#define INFll 1e18

#ifdef ONPC
#include <algo.hpp>
#else
#define dbg(...)
#define dbg_out(...)
#define myassert(Expr, Msg) ;
#endif

constexpr int upK = 201, upN = 100000 + 505;

size_t _n;
int _k;
int pa[upK][upN];
vector<ll> A, dp_prev, dp_cur;
vector<ll> pref;

inline void systemd() {
    A.assign(_n + 1, 0);
    dp_prev.assign(_n + 1, 0);
    dp_cur.assign(_n + 1, 0);
    pref.assign(_n + 2, 0);
}

ll cost(int l, int r) {
    return (pref[r] - pref[l]) * (pref[_n] - pref[r]);
}

void calc(int &k, int l, int r, int optl, int optr) {
    if (l > r)
        return;
    pair<ll, int> best = {-1, -1};
    int mid = (l + r) >> 1;
    myassert(optl <= optr, "WA: opt-left must be smaller or equal to opt-right");
    dbg(make_pair(l, r));
    dbg(make_pair(optl, optr));
    dbg(mid);
    for (int i = max(0, optl); i <= min(mid - 1, optr); i++) {
        dbg(i);
        best = max<pair<ll, int>>(best, make_pair(dp_prev[i] + cost(i, mid), i));
    }
    dbg(best);
    ll &w = best.first;
    int &opt = best.second;
    dp_cur[mid] = w;
    pa[k][mid] = opt;
    calc(k, l, mid - 1, optl, opt);
    calc(k, mid + 1, r, opt, optr);
}

char solve() {
    if (!(cin >> _n >> _k))
        return 1;
    systemd();
    for (size_t i = 1; i <= _n; i++) {
        cin >> A[i];
    }
    for (size_t i = 1; i <= _n; i++) {
        pref[i] = pref[i - 1] + A[i];
    }
    pref[_n + 1] = pref[_n];
    for (size_t i = 1; i < _n; i++) {
        dp_prev[i] = pref[i] * (pref[_n] - pref[i]);
    }
    dbg(dp_prev);
    for (int _ = 1; _ < _k; _++) {
        calc(_, 1, _n - 1, 1, _n- 1);
        dp_prev.swap(dp_cur);
        dbg(dp_prev);
    }
    ll mx = -INFll;
    size_t id = 0;
    for (size_t i = 1; i < _n; i++) {
        if (mx < dp_prev[i]) {
            mx = dp_prev[i];
            id = i;
        }
    }
    vector<int> ans;
    for (int k = _k - 1; k >= 1; --k) {
        ans.push_back(id);
        id = pa[k][id];
    }
    ans.push_back(id);
    cout << mx << ln;
    reverse(ans.begin(), ans.end());
    for (int &i : ans) {
        cout << i << ' ';
    }
#ifdef ONPC
#endif // ONPC
    return 0;
}

// Attack on titan<3

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    int t = 1e9;
    // cin >> t;
    for (int cases = 0; cases < t; cases++) {
        if (solve())
            break;
#ifdef ONPC
        cerr << "__________\n";
#endif
    }
}
// Just Imaginary
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⢀⣴⣾⠀⠀⠀⡀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣦⣾⣿⣿⣿⣿⣿⡆⠁⠀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⡠⠂⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠠⠔⠚⣿⣿⣿⣿⣿⣦⡄⠀⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⠠⠐⢂⠉⡀⣀⣤⣄⢻⣿⣿⡟⢈⡹⣿⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡀⠄⠂⠈⠀⣶⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠘⣷⡀⠀⡀⠐⠂⠐⢄
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠟⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣀⣾⣷⠯⠀⠤⠤⠄⠈
⠀⠀⠀⠀⠀⠀⣼⣿⡟⠀⠀⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣰⣿⠋⠀⠀⢠⣾⣿⣿⣿⣿⣿⣭⠟⢻⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀
⠀⠀⠀⣀⣶⡟⠁⠀⢾⣶⣿⠟⠉⠈⢻⣿⣿⣿⣦⣜⠀⠛⠛⠿⠁⠀⠀⠀⠀⠀
⠚⠻⠿⠿⡿⠁⠀⢠⣿⣿⠁⠀⣠⠖⠋⠉⠻⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣰⣿⡿⠃⠠⠊⠁⠀⠀⠀⠀⠈⢿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣴⠾⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/

#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...