Submission #1187377

#TimeUsernameProblemLanguageResultExecution timeMemory
1187377MalixSplit the sequence (APIO14_sequence)C++20
100 / 100
673 ms89088 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

int main() {   
// ios::sync_with_stdio(0);
// // cin.tie(0);
// freopen("test_input.txt", "r", stdin);
// freopen("test_output.txt", "w", stdout);
    int n,m;cin>>n>>m;
    vector<ll> a(n,0);
    vector<vector<ll>> dp(n,vector<ll>(2,0));
    vii p(n,vi(m+1));
    REP(i,0,n)cin>>a[i];
    REP(i,1,n)a[i]+=a[i-1];
    deque<int> q;
    REP(j,1,m+1){
        q.clear();
        q.push_back(j-1);
        REP(i,j,n){;
            while(q.size()>1&&dp[q[0]][0]+(a[i]-a[q[0]])*a[q[0]]<=dp[q[1]][0]+(a[i]-a[q[1]])*a[q[1]])q.pop_front();
            dp[i][1]=dp[q[0]][0]+(a[i]-a[q[0]])*a[q[0]];
            p[i][j]=q[0];
            int sz=q.size();
            while(sz>1&&(dp[i][0]-a[i]*a[i]-dp[q[sz-1]][0]+a[q[sz-1]]*a[q[sz-1]])*(a[q[sz-2]]-a[q[sz-1]])<=(dp[q[sz-1]][0]-a[q[sz-1]]*a[q[sz-1]]-dp[q[sz-2]][0]+a[q[sz-2]]*a[q[sz-2]])*(a[q[sz-1]]-a[i])){
                q.pop_back();
                sz--;
            }
            q.push_back(i);
        }
        REP(i,0,n)dp[i][0]=dp[i][1];
    }
    cout<<dp[n-1][1]<<"\n";
    int x=n-1;
    for(int j=m;j>=1;j--){
        cout<<p[x][j]+1<<" ";
        x=p[x][j];
    }
}
#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...