Submission #1165632

#TimeUsernameProblemLanguageResultExecution timeMemory
116563212345678Feast (NOI19_feast)C++17
100 / 100
97 ms2764 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const ll nx=3e5+5, inf=1e18;

ll n, qs[nx], l=0, r=inf, k;
pair<ll, ll> dp, mx;

void solve(ll x)
{
    mx={0, 0}, dp={0, 0};
    for (int i=1; i<=n; i++)
    {
        dp=max(dp, {mx.first+qs[i]-x, mx.second-1});
        mx=max(mx, {dp.first-qs[i], dp.second});
    }
}
int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k;
    for (int i=1; i<=n; i++) cin>>qs[i], qs[i]+=qs[i-1];
    while (l<r)
    {
        ll md=(l+r)/2;
        //cout<<md<<' '<<dp.first<<' '<<dp.second<<'\n';
        solve(md);
        if (-dp.second<=k) r=md;
        else l=md+1;
    }
    //cout<<"l "<<l<<'\n';
    solve(l);
    cout<<dp.first+l*k;
}

/*
find minimum lambda that make taking <= k pieces optimal
*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...