Cod sursa(job #2760578)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 27 iunie 2021 23:48:24
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");


//folosim un double ended queue in care memoram pozitiile
int A[5000005], D[5000005];
int N, K;

void Citire()
{
	//citim N si K
	fin >> N >> K;
	//citim elem din sirul A
	for (int i = 0; i <= N; i++)
		fin >> A[i];
}

long long Rezultat()
{
	int front, rear;     //pentru parcurgere prin deque
	long long S = 0;     //long long pt ca suma maxima este 5*10^13

	//initializam deque gol
	front = 0;
	rear = -1;

	for (int i = 0; i < N; i++)
	{
		//la fiecare pas elementul curent A[i] elimina de la finalul lui D toate elementele mai mari sau egale cu el
		//acesta fiind noul minim pentru subsecventele urm
		while (front <= rear && A[i] <= A[D[rear]])   
			rear--;   
		//este adaugat la finalul lui D
		D[++rear] = i;
		//eliminam de la inceputul lui D daca minimul nu mai apartine subsecv
		if (D[front] + K == i)    front++;
		//avem minim o subsecventa de K ele
		if (i + 1 >= K)   
			S += A[D[front]];
	}
	return S;
}
int main()
{
	Citire();
	fout << Rezultat();
	return 0;
}