Submission #258005

#TimeUsernameProblemLanguageResultExecution timeMemory
258005aggu_01000101Split the sequence (APIO14_sequence)C++14
0 / 100
59 ms41208 KiB
#include <iostream>
#include <assert.h>
#include <algorithm>
#include <vector>
#include <set>
#include <string>
#include <queue>
#include <map>
#include <bits/stdc++.h>
#define initrand mt19937 mt_rand(time(0));
#define rand mt_rand()
#define int long long
#define INF 10000000000000000
using namespace std;
#define mid(l, u) ((l+u)/2)
//#define cin fin
//#define cout fout
const int N = 100005;
const int K = 205;
int a[N];
int pref[N], suff[N];
int n, k;
int dp[N][K];
int nxt[N][K];
bool vis[N][K];
int f(int i, int j){
    if(i>n && j!=0) return -INF;
    if(j==0){
        nxt[i][j] = -1;
        return 0;
    }
    if(vis[i][j]) return dp[i][j];
    vis[i][j] = true;
    int amt = (suff[i]/(j+1));
    int l = i;
    int u = n - (j+1);
    int pt = i;
    while(l<=u){
        int m = mid(l, u);
        int qt = pref[m] - pref[i-1];
        if(qt <= amt){
            pt = max(pt, m);
            l = m+1;
        }
        else{
            u = m-1;
        }
    }
    //try pt
    int ans1 = f(pt+1, j-1) + ((pref[pt] - pref[i-1])*(suff[pt+1]));
    //try pt+1
    int ans2 = 0;
    if(pt+1 <= (n - (j+1))) ans2 = f(pt+2, j-1) + ((pref[pt+1] - pref[i-1])*(suff[pt+2]));
    //cout<<i<<" "<<j<<" ";
    if(ans1 > ans2){
        nxt[i][j] = pt;
    }
    else{
        nxt[i][j] = pt+1;
    }
    //cout<<nxt[i][j]<<endl;
    return dp[i][j] = max(ans1, ans2);
}
signed main(){
    //ofstream fin("2.in");
    //ofstream fout("2.out");
    cin>>n>>k;
    for(int i = 1;i<=n;i++) cin>>a[i];
    for(int i = 1;i<=n;i++) pref[i] = pref[i-1] + a[i];
    for(int i = n;i>=1;i--) suff[i] = suff[i+1] + a[i];
    cout<<f(1, k)<<endl;
    int nextind = 1;
    int currk = k;
    int lol = 0;
    while(lol<10 && nxt[nextind][currk]>0){
        cout<<nxt[nextind][currk]<<" ";
        nextind = nxt[nextind][currk] + 1;
        currk--;
        lol++;
    }
}
/*
7 3
4 1 3 4 0 2 3
 */
#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...