Cod sursa(job #533879)

Utilizator feelshiftFeelshift feelshift Data 14 februarie 2011 19:36:51
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
// http://infoarena.ro/problema/deque
#include <fstream>
#include <deque>
using namespace std;

#define maxSize 5000002

ifstream in("deque.in");
ofstream out("deque.out");

int number[maxSize];
deque<int> myDeque;

int main() {
	int numbers,lenght;
	long long sum = 0;

	in >> numbers >> lenght;

	for(int i=1;i<=numbers;++i) {
		in >> number[i];
	}

	for(int i=1;i<=numbers;++i) {
		// cat timp elementul curent este mai mic decat ultimul element din deque
		// eliminam pozitia ultimului element din acesta
		while(!myDeque.empty() && myDeque.front() <= myDeque.back() && number[i] <= number[myDeque.back()])
				myDeque.pop_back();

		// adaugam pozitia elementului curent
		myDeque.push_back(i);

		// daca elementul minim coincide cu cel de pe pozitia i-k
		// ii eliminam pozitia din deque, deoarece acesta
		// nu mai conteaza pentru pasii >=i
		if(myDeque.front() == i - lenght)
			myDeque.pop_front();

		// daca am trecut de pozitia "lenght" (avem o secventa)
		if(i >= lenght)
			// adaugam minimul la suma, acesta aflanduse pe prima pozitie
			sum += number[myDeque.front()];
	}

	out << sum;

	in.close();
	out.close();

	return (0);
}