Cod sursa(job #984179)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 13 august 2013 18:32:24
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

struct Pair
{
	int ind, key;
};

class Deque
{
	struct Node
	{
		Pair data;
		Node *next;
		Node *prev;
	};
	Node *start, *end;	
	
	Pair a;
	
public:
	
	Deque() : start(NULL), end(NULL) { }
	
	~Deque()
	{
		while(start != NULL)
			pop_back();
	}
	
	bool empty()
	{
		return start == NULL;
	}
	
	void push_front(Pair key)
	{
		if(start == NULL)
		{
			Node *c = new Node();
			c->data = key;
			start = end = c;
		}
		else
		{
			Node *c = new Node();
			c->data = key;
			c->next = start;
			start->prev = c;
			start = c;
		}
	}
	
	void push_back(Pair key)
	{
		if(end == NULL)
			push_front(key);
		else
		{
			Node *c = new Node();
			c->data = key;
			c->prev = end;
			end->next = c;
			end = c;
		}
	}
	
	Pair front()
	{
		if(start != NULL) return start->data;
		return a;
	}
	
	Pair back()
	{
		if(start != NULL) return end->data;
		return a;
	}
	
	void pop_front()
	{
		Node *c = start;
		if(start->next == NULL) start = end = NULL;
		else
		{
			start = start->next;
			start->prev = NULL;
		}
		delete c;
	}
	
	void pop_back()
	{
		Node *c = end;
		if(end->prev == NULL) start = end = NULL;
		else
		{
			end = end->prev;
			end->next = NULL;
		}
		delete c;
	}
};

int main()
{
	std::ifstream in("deque.in");
	std::ofstream out("deque.out");
	Deque myDeq;
	int nV, k;
	Pair x;
	in >> nV >> k;
	long long sum = 0;
	for(int i = 1; i <= nV; i++)
	{
		in >> x.key;
		x.ind = i;
		
		while(myDeq.front().ind <= i - k && !myDeq.empty())
			myDeq.pop_front();
		
		while(myDeq.back().key >= x.key && !myDeq.empty())
			myDeq.pop_back();
			
		myDeq.push_back(x);
		
		if(i >= k) 
			sum += myDeq.front().key;
	}
	out << sum;
	return 0;
}