Submission #1209936

#TimeUsernameProblemLanguageResultExecution timeMemory
1209936sourismkiiFeast (NOI19_feast)C++20
100 / 100
130 ms12172 KiB
//#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...