Cod sursa(job #1732842)

Utilizator jurjstyleJurj Andrei jurjstyle Data 22 iulie 2016 18:13:06
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#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 ;
}