Submission #1285716

#TimeUsernameProblemLanguageResultExecution timeMemory
1285716c32ardashFeast (NOI19_feast)C++17
100 / 100
233 ms12152 KiB
#include <iostream>
#define int long long

using namespace std;

const int NMAX=3e5+5;
int n, k, v[NMAX];
struct dyn{int val, cnt;}dp[2][NMAX], ans;

dyn maxx(dyn a, dyn b)
{
    if(a.val==b.val)
        return ((a.cnt>b.cnt)?a:b);
    return ((a.val>b.val)?a:b);
}

void solve(int lambda)
{
    dp[0][0]={0, 0};
    dp[1][0]={-lambda, 1};
    for(int i=1;i<=n;i++)
    {
        dp[0][i]=maxx(dp[0][i-1], dp[1][i-1]);
        dp[1][i]=maxx({dp[0][i-1].val+v[i]-lambda, dp[0][i-1].cnt+1}, {dp[1][i-1].val+v[i], dp[1][i-1].cnt});
    }
    ans=maxx(dp[0][n], dp[1][n]);
}

int caut_bin()
{
    int r=0, pas=(1LL<<62);
    while(pas)
    {
        solve(r+pas);
        if(ans.cnt>=k)
            r+=pas;
        pas/=2;
    }
    solve(r);
    return ans.val+r*k;
}

signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    cout<<caut_bin();
    return 0;
}
#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...