Cod sursa(job #2726343)

Utilizator vali_27Bojici Valentin vali_27 Data 20 martie 2021 19:42:38
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <deque>
 
class Deque {
	struct Node {
		int val;
		Node* prev;
		Node* next;
		Node(int x) : val(x), prev(nullptr), next(nullptr) {}
	};
	Node* left;
	Node* right;
public:
	Deque() : left(nullptr), right(nullptr) {}
	void pushLeft(int x)
	{
		Node* n = new Node(x);
		if (left == nullptr)
			left = right = n;
		else
		{
			left->prev = n;
			n->next = left;
			left = n;
		}
	}
	void pushRight(int x)
	{
		Node* n = new Node(x);
		if (right == nullptr)
			left = right = n;
		else
		{
			right->next = n;
			n->prev = right;
			right = n;
		}
	}

	int popLeft()
	{
		if (left == nullptr)return -1;
		Node* temp = left;
		int x = temp->val;
		if (left == right)
		{
			left = right = nullptr;
		}
		else
		{
			left = left->next;
		}
		delete temp;
		return x;
	}
	int popRight()
	{
		if (right == nullptr)return -1;
		Node* temp = right;
		int x = temp->val;
		if (left == right)
		{
			left = right = nullptr;
		}
		else {
			right = right->prev;
		}
		delete temp;
		return x;
	}
	int peekLeft() { return left == nullptr ? -1 : left->val; }
	int peekRight() { return right == nullptr ? -1 : right->val; }
	bool isEmpty() { return left == nullptr; }
	~Deque()
	{
		while (left != nullptr)
		{
			Node* temp = left;
			left = left->next;
			delete temp;
		}
	}
};

int v[5000000];

int main()
{
	std::ifstream f("deque.in");
	std::ofstream g("deque.out");
	Deque deq;
	int n,k;
	long long rez = 0;
	f >> n >> k;
	for (int i = 0; i < n; ++i)
		f >> v[i];

	for (int i = 0; i < n; ++i)
	{
		while (!deq.isEmpty() && v[deq.peekRight()] >= v[i])
			deq.popRight();
		
		deq.pushRight(i);
		 

		if (i < k - 1)continue;

		if (deq.peekLeft() <= i - k)
			deq.popLeft();

		rez += v[deq.peekLeft()];
	}

	g << rez;
}