Cod sursa(job #1052884)

Utilizator sp3ct3rFMI Dima Robert sp3ct3r Data 11 decembrie 2013 21:19:45
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <deque>
using namespace std;

struct elmt
{
	int d_time, value;
};

long long makeStep(deque<elmt> &d, int k, int offset, int n);

int main()
{
	freopen("deque.in", "r", stdin);
	freopen("deque.out", "w", stdout);

	int n, k, offset;
	deque<elmt> deq;

	cin >> n >> k;
	for (int i = 0; i < k - 1; i++)
	{
		int val;
		elmt e;
		cin >> val;
		if (deq.empty())
		{
			e.value = val;
			e.d_time = i + k;
			deq.push_back(e);
		}
		else
		{
			while (!deq.empty() && deq.back().value > val)
			{
				deq.pop_back();
			}
			e.value = val;
			e.d_time = i + k;
			deq.push_back(e);
		}
	}

	offset = k - 1;

	cout << makeStep(deq, k, offset, n);
}

long long makeStep(deque<elmt> &d, int k, int offset, int n)
{
	int val;
	elmt e;
	long long sum = 0;
	while (offset < n)
	{
		cin >> val;
		if (d.empty())
		{
			e.value = val;
			e.d_time = offset + k;
			d.push_back(e);
		}
		else
		{
			while (!d.empty() && d.back().value > val)
			{
				d.pop_back();
			}
			e.value = val;
			e.d_time = offset + k;
			d.push_back(e);
		}
		while (!d.empty() && d.front().d_time <= offset)
		{
			d.pop_front();
		}
		offset++;
		sum += d.front().value;
	}
	return sum;
}