Cod sursa(job #264852)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 22 februarie 2009 21:01:57
Problema Deque Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#define infile "deque.in"
#define outfile "deque.out"
#define nmax (5*1000*1000+1)
int v[nmax]; //vectorul in care citim elementele
int d[nmax]; //coada cu doua capete
int p,q; //cele doua capete ale cozii
int n; //numarul de elemente din sir
int k; //lungimea subsecventei careia trebuie sa ii calculam minimul

int main()
{
long long s=0; //aici vom calcula suma minimelor
int i;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

//citim
scanf("%d %d\n",&n,&k);
for(i=1;i<=n;i++) scanf("%d\n",&v[i]); //citim elementele sirului

p=1,q=0; //initial avem coada vida
for(i=1;i<=n;i++) //trecem pe la fiecare element al sirului
	{
	while(p<=q&&v[d[q]]>=v[i]) q--; //cat timp elementul ce trebuie sa il adaugam e mai mic decat elementul din capatul drept al cozii
	d[++q]=i; //adaugam pozitia elementului din sir la sfarsitul cozii
	if(d[p]==i-k) p++; //inseamna ca elementul minim nu mai face parte din subsecventa curenta
	if(i>=k) s+=v[d[p]]; //adaugam minimul din subsecventa curenta
	}

printf("%lld",s); //adaugam suma ceruta

fclose(stdin);
fclose(stdout);
return 0;
}