제출 #1346286

#제출 시각아이디문제언어결과실행 시간메모리
1346286tsengangSplit the sequence (APIO14_sequence)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define all(x) x.begin(), x.end()
#define ff first
#define ss second

const ll inf = 4e18;

struct l{ ll m,b,id; };

ll f(l a,ll x){ return a.m*x+a.b; }

bool bad(l a,l b,l c){
    return (__int128)(b.b-a.b)*(a.m-c.m) >= (__int128)(c.b-a.b)*(a.m-b.m);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    ll n,k; cin>>n>>k;
    vector<ll>a(n+1),s(n+1);
    for(ll i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }

    vector<vector<ll>> par(k+2, vector<ll>(n+1));
    vector<ll>dp(n+1,inf),ndp(n+1);

    dp[0]=0;

    for(ll j=1;j<=k+1;j++){
        deque<l>q;
        q.pb({0,0,0});
        for(ll i=1;i<=n;i++){
            while(q.size()>=2 && f(q[0],s[i])>=f(q[1],s[i])) q.pop_front();
            ndp[i]=f(q[0],s[i])+s[i]*s[i];
            par[j][i]=q[0].id;

            l nw={-2*s[i],dp[i]+s[i]*s[i],i};
            while(q.size()>=2 && bad(q[q.size()-2],q.back(),nw)) q.pop_back();
            q.pb(nw);
        }
        dp=ndp;
    }

    vector<ll> cuts;
    ll i=n;
    for(ll j=k+1;j>=1;j--){
        ll t=par[j][i];
        cuts.pb(t);
        i=t;
    }

    reverse(all(cuts));

    for(ll x:cuts) cout<<x<<" ";
}
#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...