Submission #1272298

#TimeUsernameProblemLanguageResultExecution timeMemory
1272298dragstSplit the sequence (APIO14_sequence)C++20
100 / 100
330 ms81860 KiB
#include <bits/stdc++.h>
using namespace std;

long long dp[2][100005], a[100005];
int dq[100005], trace[205][100005];
stack<long long> st;

bool better(long long id, long long x, long long y, long long z) {return a[x]*z+dp[id][x]<=a[y]*z+dp[id][y];}

bool better2(long long id, long long x, long long y, long long z) {return (dp[id][x]-dp[id][z])*(a[z]-a[y])<=(dp[id][y]-dp[id][z])*(a[z]-a[x]);}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    long long n, k, i, j, l, r;
    cin >> n >> k;
    for (i=1; i<=n; i++)
    {
        cin >> a[i];
        a[i]+=a[i-1];
    };
    for (i=1; i<=k+1; i++)
    {
        l=r=1;
        dq[l]=0;
        for (j=1; j<=n; j++)
        {
            while (l<r && better(1-i%2, dq[l], dq[l+1], a[j]-a[n])) {l++;};
            dp[i%2][j]=a[dq[l]]*(a[j]-a[n])+dp[1-i%2][dq[l]]+a[n]*a[j]-a[j]*a[j];
            trace[i][j]=dq[l];
            while (r>l && better2(1-i%2, j, dq[r], dq[r-1])) {r--;};
            dq[++r]=j;
        };
    };
    cout << dp[(k+1)%2][n] << "\n";
    i=k+1; j=n;
    while (i>1)
    {
        st.push(trace[i][j]);
        j=trace[i][j]; i--;
    };
    while (!st.empty())
    {
        cout << st.top() << " ";
        st.pop();
    };
}
#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...