Submission #1143838

#TimeUsernameProblemLanguageResultExecution timeMemory
1143838borisAngelovFeast (NOI19_feast)C++20
100 / 100
99 ms11004 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 300005;
const long long inf = 3e14;

int n, k;
int a[maxn];

pair<long long, int> dp[maxn][2];

pair<long long, int> solve(long long lambda)
{
    dp[1][0] = {0, 0};
    dp[1][1] = {a[1] + lambda, 1};

    for (int i = 2; i <= n; ++i)
    {
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
        dp[i][1] = max(make_pair(dp[i - 1][1].first + a[i], dp[i - 1][1].second), make_pair(dp[i - 1][0].first + a[i] + lambda, dp[i - 1][0].second + 1));
    }

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

void fastIO()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int main()
{
    fastIO();

    cin >> n >> k;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }

    long long l = -inf;
    long long r = 0;

    while (l <= r)
    {
        long long mid = (l + r) / 2;

        pair<long long, int> best = solve(mid);
        //cout << "now " << l << " " << r << " " << mid << " :: " << best.first - best.second * mid << " " << best.second << endl;

        if (best.second > k)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }

    //cout << "now lambda " << r << " :: " << solve(r).second << endl;

    cout << solve(r).first - (1LL * k) * r << endl;

    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...