Pagini recente » Cod sursa (job #3164927) | Cod sursa (job #2869302) | Cod sursa (job #990541) | Cod sursa (job #246657) | Cod sursa (job #264852)
Cod sursa(job #264852)
#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;
}