#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i128 = __int128_t;
pair<i128,int> dpc(const vector<ll>& pfs, i128 C) {
int n = pfs.size() - 1;
vector<i128> dp(n+1, (i128)LLONG_MIN * 2);
vector<int> cnt(n+1, 0);
dp[0] = 0; cnt[0] = 0;
i128 best_val = 0;
int best_cnt = 0;
for (int i = 1; i <= n; i++) {
dp[i] = dp[i-1];
cnt[i] = cnt[i-1];
i128 cand = best_val + (i128)pfs[i] + C;
int c2 = best_cnt + 1;
if (cand > dp[i]) {
dp[i] = cand;
cnt[i] = c2;
}
i128 cur = dp[i] - (i128)pfs[i];
if (cur > best_val) {
best_val = cur;
best_cnt = cnt[i];
}
}
return {dp[n], cnt[n]};
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<ll> a(n+1), pfs(n+1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
pfs[i] = pfs[i-1] + a[i];
}
if (*max_element(a.begin()+1, a.end()) <= 0) {
cout << 0 << "\n";
return 0;
}
auto [dp0_0, k0] = dpc(pfs, 0);
if (k0 <= k) {
cout << (long long)dp0_0 << "\n";
return 0;
}
i128 lo = 0, hi = (i128)1e14;
i128 c0 = 0, dp0 = 0;
while (lo <= hi) {
i128 mid = lo + ((hi - lo) >> 1);
auto [dpC, kC] = dpc(pfs, mid);
if (kC >= k) {
c0 = mid;
dp0 = dpC;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
i128 ans128 = dp0 - c0 * k;
cout << (long long)ans128 << "\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... |