Pagini recente » Cod sursa (job #613441) | Cod sursa (job #2631512) | Cod sursa (job #2690034) | Cod sursa (job #2526014) | Cod sursa (job #2649827)
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN=5000001l;
ifstream f("deque.in");
ofstream g("deque.out");
int A[MAXN],N,K;///datele de intrare
long long sMin=0;
int D[MAXN],
p=1,u=0;///init deque p<u ==> deque-ul este vid
void calcul()
{
for(int i=1; i<=N; i++)
{
/**
Cat timp elementul curent este mai mic decat ultimul element
din deque se elimina poz ultimului element din deque
*/
while(p<=u && A[i] <= A[D[u]]) u--;
///Se adauga pozitia elemntului curent in deque
D[++u]=i;
/**
Daca elementul minim coincide cu cel de pe pozitia i-K,
aceasta pozitie se elimina din deque,
deoarece nu mai conteaza pentru pasii >=i
*/
if(D[p]==i-K)p++;
///Preluam minimul din varful deque-ului
if(i>=K) sMin +=A[D[p]];
}
}
int main()
{
f >> N >> K;
for(int i=1; i<=N; i++)
f>>A[i];
calcul();
g<<sMin;
f.close();
g.close();
return 0;
}