제출 #949060

#제출 시각아이디문제언어결과실행 시간메모리
949060alexddFeast (NOI19_feast)C++17
100 / 100
191 ms12880 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 2e9;
int n,k;
int a[300005];
int dp[300005];
int cnt[300005];
int pref[300005];
int coef;
void solve()
{
    int mxm=0,cate=0;
    for(int i=1;i<=n;i++)
    {
        pref[i] = pref[i-1] + a[i];

        dp[i] = dp[i-1];
        cnt[i] = cnt[i-1];


        if(dp[i]-pref[i]>mxm || (dp[i]-pref[i]==mxm && cnt[i]>cate))
        {
            mxm = dp[i]-pref[i];
            cate = cnt[i];
        }

        int aux = mxm + pref[i] - coef;
        if(aux>dp[i] || (aux==dp[i] && cate+1>cnt[i]))
        {
            dp[i] = aux;
            cnt[i] = cate+1;
        }
    }
}
/**

dp[i] = max(dp[x] - pref[x]) + pref[i] - coef

*/
signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int st,dr,ans=n*INF;
    st=0;
    dr=n*INF;
    while(st<=dr)
    {
        coef = (st+dr)/2;
        solve();
        if(cnt[n]<=k)
        {
            ans=coef;
            dr=coef-1;
        }
        else
            st=coef+1;
    }
    coef=ans;
    solve();
    cout<<dp[n] + cnt[n]*coef;
    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...