Submission #31272

#TimeUsernameProblemLanguageResultExecution timeMemory
31272jokerno1Split the sequence (APIO14_sequence)C++14
78 / 100
886 ms91052 KiB
#include <bits/stdc++.h>
#define N 100005
#define PB push_back
#define ll long long

using namespace std;

int n, k, trace[205][N];
ll s[N], dp[N], poller;
vector <long long > v, u, vl, ul, p, pl;
bool check(ll x, ll y, ll z)
{
    return (v[z] - v[x])*(u[x] - u[y]) <= (v[y] - v[x])*(u[x] - u[z]);
}
void add(ll x, ll y, ll vt)
{
    u.PB(x);
    v.PB(y);
    p.PB(vt);
    while (u.size() >= 3 && check(u.size()-3, u.size()-2, u.size()-1))
    {
        u.erase(u.end()-2);
        v.erase(v.end()-2);
        p.erase(p.end()-2);
    }
}
ll get(ll x, ll val)
{
    return ul[x]*val+vl[x];
}
ll get_ans(ll val)
{
    if (poller >= ul.size()) poller = ul.size()-1;
    while (poller < ul.size()-1 && get(poller+1, val) >= get(poller, val)) poller++;
    return get(poller, val);
}
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen("SEQUENCE.INP", "r", stdin);
    //freopen("SEQUENCE.OUT", "w", stdout);
    cin >> n >> k;
    for (ll i = 1; i <= n; i++)
    {
        cin >> s[i];
        s[i] += s[i-1];
    }
    for (ll i = 1; i <= n; i++)
    {
        dp[i] = s[i]*(s[n] - s[i]);
        add(s[i], dp[i] - s[i]*s[n], i);
    }
    swap(ul, u); swap(vl, v); swap(pl, p);
    for (ll i = 2; i <= k; i++)
    {
        poller = 0;
        for (ll j = i; j <= n; j++)
        {
            dp[j] = get_ans(s[j]) + s[j]*s[n] - s[j]*s[j];
            trace[i][j] = pl[poller];
            add(s[j], dp[j] - s[j]*s[n], j);
        }
        swap(ul, u); swap(vl, v); swap(pl, p);
        u.clear();
        v.clear();
        p.clear();
    }
    ll res = -1; ll pos = 0; ll dem = k;
    for (ll i = 1; i <= n; i++)
        if (res <= dp[i])
        {
            res = dp[i];
            pos = i;
        }
    cout <<res<<endl;
    vector<ll> ans;
    while (dem > 0)
    {
        ans.PB(pos);
        pos = trace[dem--][pos];
    }
    sort(ans.begin(), ans.end());
    for (ll &v : ans) cout <<v<<" ";
}

Compilation message (stderr)

sequence.cpp: In function 'long long int get_ans(long long int)':
sequence.cpp:33:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (poller >= ul.size()) poller = ul.size()-1;
                ^
sequence.cpp:34:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (poller < ul.size()-1 && get(poller+1, val) >= get(poller, val)) poller++;
                   ^
#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...