제출 #1146743

#제출 시각아이디문제언어결과실행 시간메모리
1146743stanirina수열 (APIO14_sequence)C++20
71 / 100
2098 ms98888 KiB
#include <bits/stdc++.h>
#define endl '\n'
#define int long long

using namespace std;

struct Line{
    bool act=false;
    int n,k;
    int eval(int x){return k*x+n;}
    int ix;
};

vector<Line> st;
vector<int> b;
int ind;

const int INF=numeric_limits<int>::min();

void add(int node, int l, int r, Line L){
    if(!st[node].act){
        st[node]=L;
        return;
    }
    int rold=st[node].eval(b[r]), rnew=L.eval(b[r]);
    int lold=st[node].eval(b[l]), lnew=L.eval(b[l]);

    if(lold>=lnew && rold>=rnew)return;
    if(lold<lnew && rold<rnew){
        st[node]=L;
        return;
    }
    if(lold<lnew)swap(L,st[node]);
    int mid=(l+r)/2;
    if(L.eval(b[mid])<=st[node].eval(b[mid])){
        add(node*2+1,mid+1,r,L);
        return;
    }
    else{
        add(node*2,l,mid,st[node]);
        st[node]=L;
        return;
    }
}

int query(int node, int l, int r, int x){
    if(!st[node].act)return INF;
    if(l==r){ind=st[node].ix;return st[node].eval(x);}
    int mid=(l+r)/2;
    int sol=st[node].eval(x);
    ind=st[node].ix;
    if(x<=b[mid]){
        int ans=query(node*2,l,mid,x);
        if(ans<=sol)ind=st[node].ix;
        sol=max(sol,ans);
    }
    else{
        int ans=query(node*2+1,mid+1,r,x);
        if(ans<=sol)ind=st[node].ix;
        sol=max(sol,ans);
    }
    return sol;
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,k;
    cin>>n>>k;
    vector<int> v(n);
    for(int i=0;i<n;i++)cin>>v[i];

    vector<int> p(n);
    p[0]=v[0];
    for(int i=1;i<n;i++)p[i]=p[i-1]+v[i];

    vector<int> dp0(n,0);
    vector<int> dp1(n,0);
   // for(int l=0;l<n;l++)cout<<p[l]<<' ';
    //   cout<<endl;

    vector<vector<int32_t>> pos(n);
    for(int i=0;i<n;i++)pos[i].assign(k+2,-1);

    b.resize(n);
    for(int i=0;i<n;i++)b[i]=p[n-1]-p[n-1-i];
    for(int i=0;i<n;i++)dp0[i]=p[i]*(p[n-1]-p[i]);
    //for(int l=0;l<n;l++)cout<<dp0[l]<<' ';
      //  cout<<endl;

    for(int j=2;j<=k+1;j++){
        st.clear();
        st.resize(4*n);
        for(int i=1;i<n;i++){
            ind=-1;
            Line L;
            L.act=true;
            L.k=-p[i-1];
            L.n=dp0[i-1];
            L.ix=i-1;
            add(1,0,n-1,L);
            dp1[i]=query(1,0,n-1,p[n-1]-p[i])+p[i]*(p[n-1]-p[i]);

            pos[i][j]=ind;//cout<<1<<endl;
        }
        //for(int l=0;l<n;l++)cout<<dp1[l]<<' ';
        //cout<<endl;
        for(int l=0;l<n;l++)dp0[l]=dp1[l];
    }

    cout<<dp0[n-1]<<endl;
    //for(int i=0;i<=k+1;i++){
      //  for(int j=0;j<n;j++)cout<<pos[j][i]<<' ';
     //   cout<<endl;
   // }
    int tr=n-1;
    for(int i=k+1;i>1;i--){
        cout<<pos[tr][i]+1<<' ';
        tr=pos[tr][i];
    }


    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...