Cod sursa(job #2729713)

Utilizator MateiDorian123Nastase Matei MateiDorian123 Data 25 martie 2021 10:10:54
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>

using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");

/*  Problema Deque - infoarena
    Pentru a rezolva problema vom folosi o coada dubla care va retine pe prima pozitie, minimul secventei curente.
    Adaugam la coada elementele avand grija sa scoatem elementele de la inceputul cozii care
sunt mai mari decat elementul curent pentru a muta elementul minim pe prima pozitie.
    Trebie sa verificam si ca elementul de pe prima pozitie se afla inca in secventa curenta - pentru a rezolva aceasta problema
vom pune in coada dubla pozitiile elementelor din vectorul initial si vom verifica ca
*/

int v[5000005], q[5000005];
int st, dr;
int n,k;
long long s;

int main()
{
    ///Initializare coada dubla vida
    st = 0;
    dr = -1;

    ///Citire
    fin>>n>>k;
    for(int i=0;i<n;i++)
        fin>>v[i];
    fin.close();

    for(int i=0;i<n;i++){
        /// mutam minimul pe prima pozitie
        while(st <= dr && v[q[dr]] >= v[i])
            dr--;

        q[++dr] = i; /// adaugam pozitia noului element la final
        if(q[st] == i - k) /// verificam ca minimul din coada sa fie inca in secventa curenta
            st++;

        if(i >= k - 1) /// avem grija sa nu punem toate elmentele din prima secventa ca minime
            s += v[q[st]];

    }

    fout<<s;
    fout.close();

    return 0;
}