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