Submission #1149796

#TimeUsernameProblemLanguageResultExecution timeMemory
1149796windowwifeSplit the sequence (APIO14_sequence)C++20
100 / 100
811 ms83016 KiB
#include<bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = 1e5 + 2, maxk = 202;
ll n, k, a, ps[maxn], dp[maxn][2], cur;
int track[maxn][maxk];
pair<ll, int> res = {0, 0};
vector<int> op;
struct Line
{
    ll x, y;
    int id;
};
deque<Line> hull;
bool check (const Line& A, const Line& B, const Line& C)
{
    ll p = (B.x - A.x)*(C.y - A.y) - (C.x - A.x)*(B.y - A.y);
    return p >= 0;
}
void add (Line l)
{
    while (hull.size() >= 2 && check(hull[hull.size() - 2], hull.back(), l))
        hull.pop_back();
    hull.push_back(l);
}
pair<ll, int> query (int q)
{
    while (hull.size() >= 2 && hull.front().x*q + hull.front().y <= hull[1].x*q + hull[1].y) hull.pop_front();
    return {hull.front().x*q + hull.front().y, hull.front().id};
}
int main ()
{
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        cin >> a;
        ps[i] = ps[i - 1] + a;
    }
    for (int i = 1; i < n; i++)
    {
        dp[i][1] = ps[i]*(ps[n] - ps[i]);
        track[i][1] = i;
    }
    for (int j = 2; j <= k; j++)
    {
        hull.clear();
        for (int i = 1; i < n; i++)
        {
            if (i > 1)
            {
                pair<ll, int> p = query(ps[i]);
                dp[i][j & 1] = p.first + ps[i]*(ps[n] - ps[i]);
                track[i][j] = p.second;
            }
            add({ps[i], dp[i][1 ^ (j & 1)] - ps[i]*ps[n], i});
        }
    }
    for (int i = 1; i < n; i++) res = max(res, {dp[i][k & 1], i});
    cur = res.second;
    for (int j = k; j >= 1; j--)
    {
        op.push_back(cur);
        cur = track[cur][j];
    }
    reverse(op.begin(), op.end());
    cout << res.first << '\n';
    for (int x : op) cout << x << " ";
}
#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...