//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define is insert
#define pb push_back
#define pii pair<int, int>
#define pll pair<long long, long long>
#define mkp make_pair
#define X first
#define Y second
#define vi vector<int>
#define vpi vector<pair<int, int>>
#define msi multiset<int>
#define int long long
const int m97 = (int)1e9+7;
const int N = 300005;
const int K = 5;
const int inf = (int)1e18;
mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
int n, k, a[N];
pii calc(int lamda){
pii dp[n+1][2];
dp[1][0] = {0, 0};
dp[1][1] = {a[1] - lamda, 1};
for(int i=2; i<=n; i++){
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = max(mkp(dp[i-1][0].X + a[i] - lamda, dp[i-1][0].Y + 1), mkp(dp[i-1][1].X + a[i], dp[i-1][1].Y));
}
return max(dp[n][0], dp[n][1]);
}
void solve(){
cin >> n >> k;
for(int i=1; i<=n; i++) cin >> a[i];
int l = 0, r = (int)1e18;
while(l < r){
int m = (l + r + 1) >> 1;
int res = calc(m).Y;
if(res >= k) l = m;
else r = m - 1;
}
cout << calc(l).X + l * k;
}
signed main(){
// freopen("*.INP", "r", stdin);
// freopen("*.OUT", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tt = 1; //cin >> tt;
while(tt--){
solve();
}
}
/*
sample
*/
# | 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... |