제출 #1348478

#제출 시각아이디문제언어결과실행 시간메모리
1348478warrenn수열 (APIO14_sequence)C++20
100 / 100
474 ms82232 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")
const int maxn=1e5;

int n,k,a[maxn+2];
long long pref[maxn+2];
long long dp[maxn+2][2];
int opt[maxn+2][202];

void dnc(int lvl,int l,int r,int optl,int optr){
    if(l>r)return;
    int mid=(l+r)/2;
    dp[mid][lvl%2]=-1e18;
    int op=-1;
    long long mx=-1e18;

    for(int q=optl;q<=min(optr,mid-1);q++){
        long long tot=dp[q][(lvl-1)%2]+1LL*(pref[mid]-pref[q])*(pref[n]-pref[mid]);
        if(mx<tot){
            mx=tot;
            op=q;
        }
    }

    opt[mid][lvl]=op; dp[mid][lvl%2]=mx;
    dnc(lvl,l,mid-1,optl,op);
    dnc(lvl,mid+1,r,op,optr);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k; k++;
    
    for(int q=1;q<=n;q++){
        cin>>a[q];
        pref[q]=pref[q-1]+a[q];
        dp[q][0]=-1e18;
    }
    
    dp[0][0]=0;
    for(int q=1;q<=k;q++){
        dnc(q,q,n,q-1,n);
    }
    //cout<<dp[7][2]<<endl;
    cout<<dp[n][k%2]<<'\n';

    for(int q=k;q>1;q--){
        cout<<opt[n][q]<<' ';
        n=opt[n][q];
    }
}
#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...