Cod sursa(job #1493100)

Utilizator roxannemafteiuMafteiu-Scai Roxana roxannemafteiu Data 28 septembrie 2015 18:52:15
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>

#define VMAX 5000001

using namespace std;

void read();
void solve();
void write();

int n, k;
long int sum;
vector<long int > values;
deque<long int > d;

int main()
{
    read();
    solve();
    write();

    return 0;
}

void read()
{
    ifstream fin( "deque.in" );

    fin >> n >> k;
    for ( int i = 0; i < n; ++i )
    {
        long int x;
        fin >> x;
        values.push_back(x);
    }

    fin.close();
}

void solve()
{
    for ( int i = 0; i < values.size(); ++i )
    {
        //la fiecare pas i, elementul curent Ai elimina de la finalul deque-ului toate elementele mai mari sau egale cu el,
        while ( !d.empty() && values[ i ] <= values[d.back()] )
            d.pop_back();

        // apoi este inserat la finalul cozii.
        d.push_back( i );

        //se elimina apoi minimul de la inceputul cozii daca acesta nu mai apartine secventei curente (pozitia lui este mai mica sau egala cu i-K)
        if ( d.front() == i - k)
            d.pop_front();

        //in final, se aduna minimul la solutie.
        if ( i >= k - 1)
            sum += values[ d.front() ];
    }

}

void write()
{
    ofstream fout( "deque.out" );

    fout << sum;

    fout.close();
}