Cod sursa(job #533877)

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

#define maxSize 5000002

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

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

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

	in >> numbers >> lenght;

	// evitam realocarea pe pe parcurs
	//number.reserve(lenght+1);

	// pentru a evita indexarea de la zero
	//number.push_back(0);

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

		//number.push_back(tmp);
	}

	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);
}