#include<bits/stdc++.h>
using namespace std;
#define MAXN 300'007
long long ar[MAXN],dp[MAXN],sub[MAXN];
int n,k;
void makedp(long long wanda)
{
dp[1]=max(max(0LL,wanda),ar[1]+wanda);
if (dp[1]==(ar[1]+wanda)) sub[1]=1;
else if (dp[1]==wanda) sub[1]=1;
else sub[1]=0;
long long mks=ar[1];
long long koi=0;
for (int q=2;q<=n;q++)
{
if (dp[q-1]>mks)
{
mks=dp[q-1];
koi=q-1;
}
mks+=ar[q];
dp[q]=max( mks+wanda, max( dp[q-1] , dp[q-1]+wanda ) );
if (dp[q]==mks+wanda)
{
sub[q]=sub[koi]+1;
}
else if (dp[q]==dp[q-1])
{
sub[q]=sub[q-1];
}
else sub[q]=sub[q-1]+1;
}
}
int main()
{
cin>>n>>k;
for (int q=1;q<=n;q++) cin>>ar[q];
long long l=-300000000000000,r=0;
while (l<r-1)
{
long long mid=(l+r)/2;
makedp(mid);
//cout<<mid<<" "<<dp[n]<<" "<<sub[n]<<"\n";
if (sub[n]<=k) l=mid;
else r=mid;
}
makedp(l);
cout<<(dp[n]-l*k)<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |