Submission #1026155

#TimeUsernameProblemLanguageResultExecution timeMemory
1026155fv3Feast (NOI19_feast)C++14
4 / 100
30 ms9404 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

vector<ll> a, b;
ll res;

ll solve(ll pun)
{
	res = 0;
	ll last = -pun;
	ll seg_cnt = 0;

	for (auto n : b)
	{
		if (n > 0)
		{
			last += n;
			continue;
		}
		
		if (n < -pun)
		{
			if (last > 0)
			{
				res += last;
				seg_cnt++;
			}

			last = -pun;
		}
		else
		{
			last += n;
		}

		if (last < -pun)
			last = -pun;
	}

	if (last > 0)
	{
		res += last;
		seg_cnt++;
	}

	return seg_cnt;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll N, K;
	cin >> N >> K;
	for (int i = 0; i < N; i++)
	{
		ll n; cin >> n;
		if (n != 0)
			a.push_back(n);
	}
	N = a.size();

	{
		int i = 0;
		while (i < N && a[i] < 0) 
			i++;

		ll sum = 0;
		if (i < N) sum = a[i];
		for (i++; i < N; i++)
		{
			if ((a[i-1] ^ a[i]) < 0)
			{
				b.push_back(sum);
				sum = 0;
			}
			sum += a[i];
		}

		if (sum != 0)
			b.push_back(sum);

		if (b.size() && b.back() <= 0) 
			b.pop_back();
	}

	if (b.size() == 0)
	{
		cout << 0 << '\n';
		return 0;
	}

	ll l = 0ll; 
	ll r = 1000000000000000000ll;

	while (l < r)
	{
		ll c = (l + r) / 2ll;

		ll s = solve(c);

		if (s == K) l = r = c;
		if (s > K) l = c;
		if (s < K) r = c;
	}

	solve(l);
	cout << res + K * l << '\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...