#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
pair <ll, int> calc(vector <int> &a, ll lambda) {
int n = (int) a.size();
vector dp(n + 1, vector (2, 0ll));
vector mn(n + 1, vector (2, 0ll));
dp[0][0] = 0;
dp[0][1] = -inf;
mn[0][0] = 0;
mn[0][1] = inf;
for (int i = 1; i <= n; i++) {
int x = a[i - 1];
dp[i][0] = dp[i - 1][0];
mn[i][0] = mn[i - 1][0];
if (dp[i - 1][1] > dp[i][0]) {
dp[i][0] = dp[i - 1][1];
mn[i][0] = mn[i - 1][1];
} else if (dp[i - 1][1] == dp[i][0]) {
mn[i][0] = min(mn[i - 1][1], mn[i][0]);
}
dp[i][1] = x + dp[i - 1][1];
mn[i][1] = mn[i - 1][1];
if (lambda + x + dp[i - 1][0] > dp[i][1]) {
dp[i][1] = lambda + x + dp[i - 1][0];
mn[i][1] = mn[i - 1][0] + 1;
} else if (lambda + x + dp[i - 1][0] == dp[i][1]) {
mn[i][1] = min(mn[i][1], 1 + mn[i - 1][0]);
}
}
pair <ll, ll> ans;
ans.first = max(dp[n][0], dp[n][1]);
if (dp[n][0] == dp[n][1]) {
ans.second = min(mn[n][0], mn[n][1]);
} else if (dp[n][0] > dp[n][1]) {
ans.second = mn[n][0];
} else {
ans.second = mn[n][1];
}
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> n >> k;
vector <int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
ll l = -1e12 - 7, r = 1e12 + 7;
while (l <= r) {
ll mid = (l + r) / 2;
if (calc(a, mid).second <= k) {
l = mid + 1;
} else {
r = mid - 1;
}
}
ll score = calc(a, r).first - calc(a, r).second * (ll) r;
cout << max(0ll, score) << '\n';
return 0;
}
# | 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... |