Submission #1100192

#TimeUsernameProblemLanguageResultExecution timeMemory
1100192vjudge1Feast (NOI19_feast)C++17
100 / 100
136 ms15252 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long int 
const int N = 3e5 + 5, mod = 1e9 + 7;
ll arr[N];
ll dp[2][N], cnt[2][N];
int32_t main() {
    ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, k; cin >> n >> k;
	for(int i = 1; i <= n; i++) cin >> arr[i];
	ll mn = -1e16;
	ll ans = mn;
	ll lo = mn, hi = -mn;
	while(lo <= hi) {
		ll mi = (lo + hi) / 2;
		dp[1][0] = mn;
		cnt[1][0] = 1;
		for(int i = 1; i <= n; i++) {
			dp[0][i] = max(dp[0][i - 1], dp[1][i - 1]);
			if(dp[0][i - 1] > dp[1][i - 1])
				cnt[0][i] = cnt[0][i - 1];
			else
				cnt[0][i] = cnt[1][i - 1];

			dp[1][i] = max(dp[0][i - 1] - mi, dp[1][i - 1]) + arr[i];
			if(dp[0][i - 1] - mi > dp[1][i - 1]) 
				cnt[1][i] = cnt[0][i - 1] + 1;
			else cnt[1][i] = cnt[1][i - 1];
		}
		int part;
		ll cost;
		if(dp[0][n] >= dp[1][n]) {
			part = cnt[0][n]; 
			cost = dp[0][n] + part * mi;
		}
		else {
			part = cnt[1][n];
			cost = dp[1][n] + part * mi;
		}

		if(part <= k) ans = max(ans, cost), hi = mi - 1;
		else lo = mi + 1; 
	}
	cout << ans << "\n";
	return 0;
}
#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...