제출 #1160038

#제출 시각아이디문제언어결과실행 시간메모리
1160038haruki291sa수열 (APIO14_sequence)C++17
0 / 100
0 ms328 KiB
#include "bits/stdc++.h"
using namespace std;
using ll=long long;
ll D[100003][2],S[100003];
int dq[100003],anc[100003][222];
bool vis[100003];
int n,k;
bool g1(int a,int b,int c){
    return (D[b][0]-D[a][0])>=(S[b]-S[a])*(S[n]-S[c]);
}
bool g2(int a,int b,int c){
    return (D[b][0]-D[a][0])*(S[c]-S[b])<=(D[c][0]-D[b][0])*(S[b]-S[a]);
}
int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>S[i];
        S[i]+=S[i-1];
    }
    int cnt,pos;
    for(int i=1;i<=k;i++){
        cnt=pos=0;
        dq[cnt++]=0;
        for(int j=1;j<=n;j++){
            while(cnt-pos>1&&g1(dq[pos],dq[pos+1],j))pos++;
            int idx=dq[pos];
            D[j][1]=D[idx][0]+(S[j]-S[idx])*(S[n]-S[j]);
            anc[i][j]=idx;
            //dq[++cnt]=j;
            while(cnt-pos>1&&g2(dq[cnt-2],dq[cnt-1],j))cnt--;
            dq[cnt++]=j;
        }
        for(int j=1;j<=n;j++)D[j][0]=D[j][1];
    }
    ll ans=-1e18;
    int tmp=0;
    for(int i=1;i<=n;i++){
        if(ans<D[i][0]){
            ans=D[i][0];
            tmp=i;
        }
    }
    cout<<ans<<"\n";
    vector<int>pr;
    int t=k;
    while(tmp){
        vis[tmp]=true;
        pr.push_back(tmp);
        tmp=anc[t][tmp];
        t--;
    }
    for(int i=1;i<n&&pr.size()<k;i++){
        if(vis[i])continue;
        vis[i]=true;
        pr.push_back(i);
    }
    sort(pr.begin(),pr.end());
    for(int p:pr)cout<<p<<" ";
    cout<<endl;
    return 0;
}
#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...