Submission #1319459

#TimeUsernameProblemLanguageResultExecution timeMemory
1319459simona1230Feast (NOI19_feast)C++20
4 / 100
55 ms12032 KiB
#include <bits/stdc++.h>

using namespace std;
long long n,k,a[300001];
long long neg;
void read()
{
    cin>>n>>k;
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]<0)neg++;
    }

    k=min(k,neg+1);
}

pair<long long,long long> dp[300001][2];

pair<long long,long long> group(long long x)
{
    dp[1][0]={0,0};
    dp[1][1]={a[1]-x,1};

    //cout<<x<<"!"<<endl;
    for(long long i=2;i<=n;i++)
    {
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
        pair<long long,long long> p1={dp[i-1][0].first+a[i]-x,dp[i-1][0].second+1},
                        p2={dp[i-1][1].first+a[i],dp[i-1][1].second};
        dp[i][1]=max(p1,p2);

        //cout<<dp[i][0].first<<" "<<dp[i][1].first<<" "<<dp[i][1].second<<" "<<dp[i][0].second<<endl;
    }

    return max(dp[n][0],dp[n][1]);
}

void solve()
{
    long long ans=0;
    long long l=0,r=1e9;
    while(l<=r)
    {
        long long m=(l+r)/2;
        pair<long long,long long> g=group(m);

        //cout<<"in "<<m<<" "<<g.first<<" "<<g.second<<endl;

        if(g.second>=k)
        {

            ans=max(ans,g.first+m*k);
            l=m+1;
        }
        else r=m-1;
    }

    cout<<ans<<endl;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	read();
	solve();
	return 0;
}
/*
10 4
2 0 1 1 0 1 1 1 1 1
*/
#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...