Cod sursa(job #3283012)

Utilizator maxtraAlex Deonise maxtra Data 7 martie 2025 20:32:07
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
/*
idee principala: problema cere sa determinam minimul fiecarei subsecvente de lungime k
intr un sir de lungime n si sa calculam suma acestor minime

folosim un deque (coada cu acces la ambele capete) pentru a mentine eficient minimul fiecarei
subsecvente



*/
#include <bits/stdc++.h>

using namespace std;

int main() {
	ifstream cin("deque.in");
	ofstream cout("deque.out");

	int n, k;
	cin >> n >> k;

	long long sum = 0;
	vector<int> v(n);
	deque<int> dq;

	for (int i = 0; i < n; i++) {
		cin >> v[i];

		// elimin elementele iesite din fereastra k
		// daca elementul din capul deque-ului (dq.front()) a iesit din fereastra de k elemente,
		// il eliminam

		// ex: daca i = 3 si k = 3, atunci elementul i - k = 0 trebuie eliminat
		if (!dq.empty() && dq.front() == i - k)
			dq.pop_front();

		// eliminarea elementelor mai mari din dreapta (pentru mentinerea minimului)
		
		// elimin toate elementele din spatele deque-ului care sunt mai mari decat noul element
		// v[i], deoarece acestea nu vor mai putea fi minime intr-o fereastra viitoare
		
		// ex: (9, 2, 4) -> la pasul cu 2 eliminam 9 din dq deoarece 2 este mai mic si devine noul
		// candidat pentru minim
		// la pasul cu 4, pastrez 2 deoarece 2 < 4
		while (!dq.empty() && v[i] <= v[dq.back()])
		    dq.pop_back();
		    
		// adaug noul element in dq
		dq.push_back(i);
		
		// calculul sumei minimelor
		
		// incepand de al k-lea element (i >= k - 1)
		// adaugam in sum valoarea minima a unei ferestre curente
		// minimul este mereu la pozitia dq.front()
		if (i >= k - 1)
		    sum += v[dq.front()];
	}
		    
	cout << sum;
	
	return 0;

}