#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
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]);
}
if (lambda + x + dp[i - 1][1] > dp[i][1]) {
dp[i][1] = lambda + x + dp[i - 1][1];
mn[i][1] = mn[i - 1][1] + 1;
} else if (lambda + x + dp[i - 1][1] == dp[i][1]) {
mn[i][1] = min(mn[i][1], 1 + mn[i- 1][1]);
}
}
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;
}
int32_t 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 = 0;
while (l <= r) {
ll mid = (l + r) / 2;
if (calc(a, mid).second <= k) {
l = mid + 1;
} else {
r = mid - 1;
}
}
l = -1e12 - 7;
while (r - l > 3) {
ll mid1 = l + (r - l) / 3;
ll mid2 = r - (r - l) / 3;
ll score1 = calc(a, mid1).first - calc(a, mid1).second * (ll) mid1;
ll score2 = calc(a, mid2).first - calc(a, mid2).second * (ll) mid2;
if (score1 <= score2) {
l = mid1;
} else {
r = mid2;
}
}
ll score = -inf * (ll) n;
for (int i = l; i <= r; i++) {
score = max(score, calc(a, i).first - calc(a, i).second * (ll) i);
}
cout << 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... |