Pagini recente » Cod sursa (job #2744781) | Cod sursa (job #2955096) | Cod sursa (job #551659) | Cod sursa (job #2902715) | Cod sursa (job #2825450)
//Se da un sir A cu N numere intregi.
//Pentru fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime.
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
//metoda sliding window
#define maxn 5000010
int arr[maxn], deq[maxn]; //arr e lista de nr, deq e coada dubla
int n,k; //n e nr de elem, k nr de elem din subsir
int frt, bck; //frt-front la deque, bck-back la deque
long long suma=0;
int main()
{
//citire lista de numere
in>>n>>k;
int i;
for( i=1;i<=n;i++)
in>>arr[i];
//deque e vida
frt=1;
bck=0;
//
for(i=1;i<=n; ++i)
{
while((frt<=bck) && (arr[i] < arr[deq[bck]])) //in deque se stocheaza pozitiile (i), iar cand apeleaza arr[deq[bck]
bck--; //o sa ia, de fapt, elementul din arr al carui indice este in deque (adica ultimul el din deq)
deq[++bck]=i; //adauga pozitia elem la finalul cozii
if(deq[frt] + k == i)
frt++; //daca elem minim din deque nu mai apartine secventei k, il eliminam
if(i>=k)
suma += arr[deq[frt]]; //elem cel mai mic va fi mereu primul in deque
}
out<<suma;
return 0;
}