Submission #814708

#TimeUsernameProblemLanguageResultExecution timeMemory
814708BamshooTFeast (NOI19_feast)C++14
100 / 100
167 ms17388 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long,int> ii;
const int N = 300005;
long long n, k, m = 1, a[N], L[N], R[N], cntD = 0;
set<ii> sf, sd;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >>n >>k;
	for(int i=1; i<=n; i++)
		cin >>a[i];
	m = 0;
	for(int i=1; i<=n; i++)
		if(a[i] != 0) a[++m] = a[i];
	n = m, m = 1;
	while (m <= n && a[m] < 0) m++;
	int u = 1;
	a[1] = a[m];
	for(int i=m+1; i<=n; i++)
		if(a[i]*a[i-1] > 0)
			a[u] += a[i];
		else
			a[++u] = a[i];
	if(a[u] < 0) u--;
	m = u;
	for(int i=1; i<=m; i++)
	{
		cntD += (a[i] > 0);
		sf.insert({abs(a[i]), i});
		L[i] = i-1, R[i] = i+1;
	}
	while(cntD > k)
	{
		int v = sf.begin()->first, i = sf.begin()->second;
		int x = L[i], y = R[i];
		sf.erase(sf.begin());
		if(L[i]==0 && a[i] <= 0)
			L[R[i]] = 0;
		else if(R[i]>m && a[i] <= 0)
			R[L[i]] = m+1;
		else if(L[i] >= 1 && R[i] <= m)
		{
			cntD--;
			sf.erase(sf.find({abs(a[x]), x}));
			sf.erase(sf.find({abs(a[y]), y}));
			a[x] = a[x] + a[i] + a[y];
			sf.insert({abs(a[x]), x});
			L[R[y]] = x, R[x] = R[y];
		}
		else if(L[i] >= 1)
		{
			cntD--;
			sf.erase(sf.find({abs(a[x]), x}));
			a[x] = a[x] + a[i];
			sf.insert({abs(a[x]), x});
			R[x] = m+1;
		}
		else if(R[i] <= m)
		{
			cntD--;
			sf.erase(sf.find({abs(a[y]), y}));
			a[i] = a[i] + a[y];
			sf.insert({abs(a[i]), i});
			L[R[y]] = i, R[i] = R[y];
		}
	}
	long long sum = 0;
	for(auto x : sf)
	{
		if(a[x.second] > 0)
			sum += x.first;
	}
	cout <<sum;
	return 0;
}

Compilation message (stderr)

feast.cpp: In function 'int main()':
feast.cpp:36:7: warning: unused variable 'v' [-Wunused-variable]
   36 |   int v = sf.begin()->first, i = sf.begin()->second;
      |       ^
#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...