Pagini recente » Cod sursa (job #482068) | Cod sursa (job #1247892) | Cod sursa (job #629941) | Cod sursa (job #2586476) | Cod sursa (job #2825445)
//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
int arr[5000005], deq[5000005]; //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)
{
cout<<bck<<" ";
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;
}