#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 val = 0;
int cnt0 = 0;
for (int i = 1; i <= n; i++) {
dp[i] = dp[i-1];
cnt[i] = cnt[i-1];
i128 dpi = val + (i128)pfs[i] + C;
int ci = cnt0 + 1;
if (dpi > dp[i]) {
dp[i] = dpi;
cnt[i] = ci;
}
i128 cur = dp[i] - (i128)pfs[i];
if (cur > val) {
val = cur;
cnt0 = 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, 0);
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;
}
i128 lo = -(i128)1e14, hi = (i128)1e14;
i128 c0 = hi, dp0 = 0;
while (lo <= hi) {
i128 mid = lo + ((hi - lo) >> 1);
auto [dpC, kC] = dpc(pfs, mid);
if (kC >= k) {
c0 = mid;
dp0 = dpC;
hi = mid - 1;
} else {
lo = mid + 1;
}
}
i128 ans128 = dp0 - c0 * k;
ll answer = (ll)ans128;
cout << answer << "\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... |