Submission #446186

#TimeUsernameProblemLanguageResultExecution timeMemory
446186nishuzSplit the sequence (APIO14_sequence)C++17
100 / 100
1443 ms81840 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2")
 
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace __gnu_pbds;
using namespace std;
 
#define ll long long
#define ld long double
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define eb emplace_back
#define F first
#define S second
#define mp make_pair
#define random mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
 
template <typename T> using oset = tree <pair <T, T>, null_type, less <pair <T, T>>, rb_tree_tag, tree_order_statistics_node_update>;
 
template <typename Container>
void Print(Container& container, int starting) {
    auto Start = container.begin() + starting, End = container.end();
    while (Start != End) cout << *(Start++) << " ";
    cout << '\n';
}
 
template <typename T>
void print(T&& t) {cout << t << '\n';}
 
template <typename T, typename... Args>
void print(T&& t, Args&&... args) {
    cout << t << " ";
    print(forward<Args>(args)...);
}

const int32_t MAXN = 1e5 + 5, MAXK = 205;
int64_t a[MAXN], dp[2][MAXN], n;
int32_t par[MAXK][MAXN];

void compute(int32_t l, int32_t r, int32_t optl, int32_t optr, int32_t k)
{
    if (l > r) return;
    int32_t mid = (l + r) >> 1, row = k & 1;
    pair <int64_t, int64_t> best = make_pair(-1, -1);
    for (int64_t i = optl; i < min(mid, optr + 1); ++i) best = max(best, make_pair(dp[row ^ 1][i] + (a[n] - a[mid]) * (a[mid] - a[i]), i));
    dp[row][mid] = best.first;
    par[k][mid] = best.second;
    int64_t opt = best.second;
    compute(l, mid - 1, optl, opt, k);
    compute(mid + 1, r, opt, optr, k);
}

inline void solve() {
    int32_t k;
    cin >> n >> k;
    memset(a, 0, sizeof a);
    for (int32_t i = 1; i <= n; ++i) {
        cin >> a[i];
        a[i] += a[i - 1];
    }
    for (int32_t i = 0; i <= k; ++i) {
        for (int32_t j = 0; j <= n; ++j) {
            par[i][j] = -1;
        }
    }
    for (int32_t i = 0; i <= n; ++i) {
        dp[0][i] = dp[1][i] = -1;
    }
    dp[0][0] = 0;
    for (int32_t i = 1; i <= k; ++i) {
        compute(0, n - 1, 0, n - 1, i);
    }
    pair <int64_t, int32_t> ans = mp(-1, -1);
    for (int32_t i = 1; i <= n; ++i) {
        ans = max(ans, mp(dp[k & 1][i], i));
    }
    print(ans.F);
    vector <int32_t> seq(k + 1);
    int32_t cur = k;
    while (k && ans.S != -1) {
        seq[cur--] = ans.S;
        assert(ans.S >= 1 && ans.S <= n);
        ans.S = par[k--][ans.S];
    }
    Print(seq, 1);
}
 
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    // cin >> T;
    for (int test = 1; test <= T; ++test) {
        // cout << "Case #" << test << ": ";
        solve();
    }
}
#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...