Pagini recente » Cod sursa (job #1876566) | Cod sursa (job #861843) | Monitorul de evaluare | Cod sursa (job #2392479) | Cod sursa (job #1732842)
#include <fstream>
#include <deque>
#include <vector>
using namespace std ;
ifstream f ("deque.in") ;
ofstream g ("deque.out") ;
deque <int> sol ; //va memora indici , cu care se va lucra
vector <int> v ; //va memora valorile sirurilor
int N , K , x ;
long long s ; //suma finala
int main ()
{
f >> N >> K ;
v.resize ( N + 1 ) ;
for ( int i = 1 ; i <= N ; ++i )
{
f >> v[i] ; //citim valoarea
while ( sol.empty () == 0 && v[i] <= v[sol.back()] ) //eliminam din dreapta cat timp valoarea maxima din deque e mai mare/egala cu cea citita sau ne oprim cand e gol dequeu
sol.pop_back() ;
sol.push_back(i) ; //adaugam in capatul din dreapta indicele i cu valoarea asimilata (v[i])
if ( sol.front() == i - K ) //daca minimul nostru nu mai face parte din secventa noastra , il eliminam din stanga
sol.pop_front() ;
if ( i >= K ) // daca deja avem o secventa ( am citit minim K numere )
s += v[sol.front()] ; //adaugam adresa minimului , adica v[deque[1]] , deoarece deque are indicii in functie de valori crescatoare
}
g << s ;
}