Submission #1287309

#TimeUsernameProblemLanguageResultExecution timeMemory
1287309Jawad_Akbar_JJFeast (NOI19_feast)C++20
12 / 100
1095 ms6588 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
#define int long long
const int N = 1<<19;
int a[N], Ans;

signed main(){
	int n, k, cur = 0;
	cin>>n>>k;

	vector<pair<int, int>> vec;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		if (cur == 0 or a[i] == 0)
			cur += a[i];
		else if ((cur < 0) == (a[i] < 0))
			cur += a[i];
		else{
			vec.push_back({cur, i});
			cur = a[i];
		}
	}
	if (cur > 0)
		vec.push_back({cur, n});
	if (vec.size() > 0 and vec[0].first < 0)
		vec.erase(begin(vec));

	while ((vec.size() + 1) / 2 > k){
		int id = -1, mn = 1e17;
		for (int i=1;i<vec.size()-1;i += 2){
			if (-vec[i].first < min(vec[i+1].first, vec[i-1].first)){
				if (-vec[i].first <= mn)
					id = i, mn = -vec[i].first;
			}
		}

		if (id == -1)
			break;
		vec[id-1] = {vec[id+1].first + vec[id-1].first + vec[id].first, vec[id-1].second};
		vec.erase(begin(vec) + id);
		vec.erase(begin(vec) + id);
	}

	vector<int> ansVec;
	for (int i=0;i<vec.size();i += 2)
		ansVec.push_back(vec[i].first);
	sort(begin(ansVec), end(ansVec));

	while (k > 0 and ansVec.size() > 0)
		Ans += ansVec.back(), ansVec.pop_back(), k--;
	cout<<Ans<<'\n';
}
#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...