제출 #1304163

#제출 시각아이디문제언어결과실행 시간메모리
1304163brover29수열 (APIO14_sequence)C++20
71 / 100
80 ms196608 KiB
#include <bits/stdc++.h>
//qwerty47924692
using namespace std;
using ll = long long;
const ll N=1e5+29;
const string br="617283";
ll dp[N][202],a[N],n,k,pref[N];
int opt[N][205];
struct line{
    ll k,b,i;
    ll get(ll x){
        return k*x+b;
    }
}st[N];
ll sz;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>k;
    ll K=k;
    for(ll i=1;i<=n;i++){
        cin>>a[i];
        pref[i]=pref[i-1]+a[i];
    }ll ans=-1e18;

    for(ll x=1;x<=k;x++){
        sz=0;
        ll r=1;

        for(ll i=x;i<=n;i++){
            ll b=-pref[n]*pref[i-1]+dp[i-1][x-1];
            ll k=pref[i-1];
            while(sz>1&&(b-st[sz-1].b)*(st[sz-1].k-st[sz].k)<=(st[sz].b-st[sz-1].b)*(st[sz-1].k-k))sz--;
            sz++;
            st[sz].k=k;
            st[sz].b=b;
            st[sz].i=i-1;
            r=min(r,sz);
            while(r<sz&&st[r].get(pref[i])<st[r+1].get(pref[i]))r++;
            dp[i][x]=st[r].get(pref[i]);
            opt[i][x]=st[r].i;
          //  assert(st[r].i>=x-1);
            dp[i][x]+=(pref[n]-pref[i])*(pref[i]);
            ans=max(ans,dp[i][x]);
        }
    }

    cout<<ans<<'\n';
    vector<ll>v;
    ll m=0;
    for(ll i=k;i<=n;i++){
        if(dp[i][k]==ans){
            m=i;
            break;
        }
    }
    assert(m);
    while(k){
        v.push_back(m);
        m=opt[m][k];
        k--;
    }
    reverse(v.begin(),v.end());
    assert(v.size()==K);
    for(ll i:v){
        assert(i>0);
        cout<<i<<' ';
    }
}
// I am gay
#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...