#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<ll> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<ll> prefix(n + 1, 0);
for (int i = 1; i <= n; ++i) {
prefix[i] = prefix[i - 1] + a[i - 1];
}
ll lo = -1e14, hi = 1e14;
ll ans = -1e18;
for (int iter = 0; iter < 100; ++iter) {
ll mid = lo + (hi - lo) / 2;
vector<ll> dp(n + 1, -1e18);
dp[0] = 0;
ll max_val = -1e18;
for (int i = 1; i <= n; ++i) {
if (i >= 2) {
max_val = max(max_val, dp[i - 1] - prefix[i - 1]);
} else {
max_val = dp[0] - prefix[0]; // 0
}
ll candidate = max_val + prefix[i] - mid;
dp[i] = max(dp[i - 1], candidate);
}
int s = 0;
for (int i = 1; i <= n; ++i) {
if (dp[i] > dp[i - 1]) {
s++;
}
}
if (s == k) {
ans = dp[n] + mid * k;
}
// Adjust binary search
if (s > k) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
cout << 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... |