Submission #48916

#TimeUsernameProblemLanguageResultExecution timeMemory
48916BenqSplit the sequence (APIO14_sequence)C++14
71 / 100
2067 ms49540 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, ll> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

ll ans = 0;
int n,k;
ll num[MX], sum[MX];
array<ll,MX> dp, dp2;
int pre[202][MX];

ll eval(int x, pi y) {
    return (sum[x]-sum[y.f])*(sum[x]-sum[y.f])+y.s;
}

int bet(pi x, pi y) {
    int lo = x.f+1, hi = n+1;
    while (lo < hi) {
        int mid = (lo+hi)/2;
        if (eval(mid,x) < eval(mid,y)) hi = mid;
        else lo = mid+1;
    }
    return lo;
}

void ad(deque<pi>& cur, pi x) {
    if (x.s == INF) return;
    while (sz(cur) > 1) {
        pi y = cur.back(); cur.pop_back();
        // cout << "HI " << bet(y,cur.back()) << " " << eval(n,x) << " " << eval(n,y) << " " << bet(x,y) << "\n";
        // cout << x.f << " " << x.s << " " << y.f << " " << y.s << "\n";
        if (bet(y,cur.back()) >= bet(x,y)) {
            
        } else {
            cur.pb(y);
            break;
        }
    }
    //cout << "AH " << x.f << " " << x.s << "\n";
    cur.pb(x);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> k; k++;
    FOR(i,1,n+1) {
        cin >> num[i];
        sum[i] = num[i]+sum[i-1];
    }
    FOR(i,1,n+1) dp[i] = 1e18;
    FOR(i,1,k+1) {
        swap(dp,dp2);
        deque<pi> cur;
        FOR(j,i,n+1) {
            ad(cur,{j-1,dp2[j-1]});
            while (sz(cur) > 1) {
                pi x = cur.front(); cur.pop_front();
                if (eval(j,x) > eval(j,cur.front())) {
                    
                } else {
                    cur.push_front(x);
                    break;
                }
            }
            dp[j] = eval(j,cur.front());
            pre[i][j] = cur.front().f;
            // cout << j << " " << i << " " << cur.front().f << " " << cur.front().s << " " << dp[i][j] << "\n";
        }
        // cout << "----\n";
    }
    int x = n;
    vi v;
    FORd(i,1,k+1) {
        x = pre[i][x];
        if (i > 1) v.pb(x);
    }
    reverse(all(v));
    cout << (sum[n]*sum[n]-dp[n])/2 << "\n";
    for (int i: v) cout << i << " ";
}

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?)
#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...