Cod sursa(job #2720993)

Utilizator vladalex420@gmail.comLuta Vlad Alexandru [email protected] Data 11 martie 2021 14:40:04
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <utility>

struct Deque
{
	//first is the nr, second is it's index
	std::pair<int, int> *data;

	void create(int size)
	{
		data = new std::pair<int, int>[size];

		beginPos = 0;
		endPos = 0;
	}

	//iterator like, endPos is one + the last element
	int endPos;
	int beginPos;

	std::pair<int, int> &getEnd()
	{
		return data[endPos - 1];
	}

	std::pair<int, int> &getBegin()
	{
		return data[beginPos];
	}

	void removeEnd()
	{
		endPos--;
	}

	int size()
	{
		return (endPos - beginPos);
	}


	void removeBegin()
	{
		beginPos++;
	}

	void clear()
	{
		delete[] data;
	}

	std::pair<int, int> &elAtIndex(int i)
	{
		return data[beginPos + i];
	}

	void sort()
	{
		for (int i = 0; i < size(); i++)
		{
			for (int j = 0; j < size() - 1; j++)
			{
				auto &el1 = elAtIndex(j);
				auto &el2 = elAtIndex(j + 1);
				if (el1.first > el2.first)
				{
					auto el3 = el1;
					el1 = el2;
					el2 = el3;
				}
			}
		}

	}

	void insertEnd(std::pair<int, int> p)
	{
		data[endPos++] = p;
	}

};


int main()
{
	std::ifstream f("deque.in");
	
	if (!f.is_open())
	{
		return 1;
	}

	int n, k;
	f >> n >> k;
	
	int *v;
	v = new int[n];
	
	{
		int vindex = 0;
		for (int i = 0; i < n; i++)
		{
			int nr;
			f >> nr;
			v[vindex++] = nr;
		}
	}
	
	Deque deque;
	deque.create(n + 2);

	
	long int suma = 0;
	
	
	//for(int i=0; i<k; i++)
	//{
	//	deque.insertEnd({ v[i], i });
	//}
	//
	//deque.sort();

	//suma += deque.getBegin().first;

	for(int i=0; i<n; i++)
	{

		int ai = v[i];

		while(deque.size())
		{
			auto el = deque.getEnd();

			if(el.first >= ai)
			{
				deque.removeEnd();
			}else
			{
				break;
			}
		}
		
		deque.insertEnd({ ai, i });

		if (deque.getBegin().second <= i - k)
		{
			deque.removeBegin();
		}
		
		int el = deque.getBegin().first;

		if(i>=k-1)
		{
			suma += el;
		}
	}

	f.close();
	delete[] v;

	std::ofstream fout("deque.out");
	fout << suma;
	fout.close();

	return 0;
}