Cod sursa(job #3200000)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 3 februarie 2024 10:45:52
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <deque>
using namespace std;

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

const int NMAX = 5e6 + 1;

int a[NMAX];

deque<int> dq;

int n, k;

int main()
{
    fin >> n >> k;
    for (int i = 1; i <= n; ++i)
        fin >> a[i];

    // configuram primele k numere
    for (int i = 1; i <= k; ++i)
    {
        while (!dq.empty() && a[dq.back()] >= a[i])
            dq.pop_back();
        dq.push_back(i);
    }

    long long sum = a[dq.front()];

    for (int i = k + 1; i <= n; ++i)
    {
        // la fiecare pas, gasim minum pentru intervalul [i - k + 1, i]
        int left = i - k + 1;
        // ne asiguram ca minimele din deque sunt in ordine crescatoare
        // in momentul in care primul element din dque nu se mai incadreaza intervalilui nostru,
        // trebuie sa gasi urmatoarea pozitie valabila ca fiind minimul pe interval
        // asadar, orice element pe care il introducem trebuie sa stearga elementele mai mari care se afla inaintea lui
        while (!dq.empty() && a[dq.back()] >= a[i])
            dq.pop_back();
        // verificam daca primul element se afla in intervalul nostru, daca nu, il eliminam din deque
        if (!dq.empty() && dq.front() < left)
            dq.pop_front();
        // adaugam noul index
        dq.push_back(i);
        // actualizam suma
        sum += a[dq.front()];
    }

    fout << sum << '\n';

    return 0;
}