#include <iostream>
using namespace std;
#define ll long long
const int N = 3e5 + 10;
int n, k, MinPre, it[N], f[N][2], F;
ll a[N], dp[N][2], DP;
void dodp(ll delta) {
dp[1][0] = 0;
dp[1][1] = a[1] - delta;
f[1][1] = 1;
for (int i = 2; i <= n; ++i) {
if (dp[i - 1][0] + a[i] - delta > dp[i - 1][1] + a[i]) {
dp[i][1] = dp[i - 1][0] + a[i] - delta;
f[i][1] = f[i - 1][0] + 1;
} else {
dp[i][1] = dp[i - 1][1] + a[i];
f[i][1] = f[i - 1][1];
}
if (dp[i - 1][0] > dp[i - 1][1]) {
dp[i][0] = dp[i - 1][0];
f[i][0] = f[i - 1][0];
} else {
dp[i][0] = dp[i - 1][1];
f[i][0] = f[i - 1][1];
}
}
if (dp[n][1] > dp[n][0]) {
DP = dp[n][1];
F = f[n][1];
} else {
DP = dp[n][0];
F = f[n][0];
}
}
int main() {
cin.tie(0); cout.tie(0);
ios_base::sync_with_stdio(false);
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
ll l = 0, r = 1e12, ans = l;
while (l <= r) {
ll mid = (l + r) >> 1;
dodp(mid);
if (F <= k) {
r = mid - 1;
ans = mid;
} else {
l = mid + 1;
}
}
dodp(ans);
cout << max(0ll, DP + (ll)F * ans) << "\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... |