Submission #1313243

#TimeUsernameProblemLanguageResultExecution timeMemory
1313243danglayloi1Split the sequence (APIO14_sequence)C++20
100 / 100
648 ms81588 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=1e5+5;
int n, k;
ll a[nx], f[nx], g[nx];
ll A(int i)
{
    return a[i];
}
ll B(int i)
{
    return g[i]-a[i]*a[i];
}
long double inter(int i, int j)
{
    return (long double)(B(i)-B(j))/(A(j)-A(i));
}
deque<int> st;
vector<int> ve;
int trace[205][nx];
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
        cin>>a[i], a[i]+=a[i-1];
    for(int i = 1; i <= n; i++)
        g[i]=-inf;
    for(int l = 1; l <= k+1; l++)
    {
        st.clear();
        for(int i = 0; i <= n; i++)
        {
            if(i>0)
            {
                while(st.size()>1 && ((A(st[0])==A(st[1]) && B(st[0])==B(st[1])) || inter(st[0], st[1])<=a[i]))
                    st.pop_front();
                int j=st.front();
                f[i]=A(j)*a[i]+B(j);
                trace[l][i]=j;
            }
            while(st.size()>1 && (A(i)==A(st.back()) || inter(st[st.size()-2], st.back())>=inter(st.back(), i)))
                st.pop_back();
            st.push_back(i);
        }
        for(int i = 0; i <= n; i++)
            g[i]=f[i];
    }
    cout<<f[n]<<'\n';
    for(int i = k+1; i >= 2; i--)
    {
        n=trace[i][n];
        ve.emplace_back(n);
    }
    reverse(ve.begin(), ve.end());
    for(int x:ve) 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...