Cod sursa(job #658645)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 9 ianuarie 2012 11:23:37
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
/*
	v[i] 			= al i-lea element citit
	q 				= pastreaza elementele din vector in ordine crescatoare
	poz[i] 		= pozitia elementului q[i] in raport cu vectorul v
*/

#include<cstdio>
#include<vector>
#include<deque>

using namespace std;
long long n, k, sum;
vector <long long> v;
deque <long long> q, poz;

int main() {
	long long i, x, top = 0;
	
	freopen("deque.in", "r", stdin), freopen("deque.out", "w", stdout);
	
	// Citire date
	scanf("%lld %lld", &n, &k);	
	for(i = 0; i < n; i++) scanf("%lld", &x), v.push_back(x);
	
	sum = 0;
	for(i = 0; i < v.size(); i++) {
		// Extragem ultimul element din coada cat timp acesta
		// este mai mare sau egal cu elementul curet
		while(q.size() > 0 && q.back() >= v[i]) {			
			q.pop_back();
			poz.pop_back();
		}
		
		// Adaugam elementul in coada
		q.push_back(v[i]);
		poz.push_back(i);
		top++;
		
		// daca avem elementele unei secvente parcurse
		if(top == k) {
			sum += q.front();
			
			// daca primiul element din coada (minimul) nu mai apartine
			// secventei atunci il scoatem din coada
			if(poz.front() <= i - k + 1) {
				q.pop_front();
				poz.pop_front();
			}
			
			top--;
		}
	}
	
	printf("%lld\n", sum);
	
	return 0;
}