Cod sursa(job #2732029)

Utilizator truscalucaLuca Trusca truscaluca Data 28 martie 2021 17:21:48
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>

using namespace std;

const int nMax = 5000005;

int v[nMax], dq[nMax], front = 1, back, n, k;
long long sum;

int main() {
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);

    // Iau 60p fara astea :(
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> v[i];

        // Deque-ul este de forma [x minim, y>x dar mai recent adaugat, z>y dar si mai recent adaugat, etc].
        // Aici incerc sa scot cat mai multe elemente ce au devenit "inutile" odata cu citirea ultimului.
        // Parcurg de la dreapta la stanga fiindca asta e ordinea descrescatoare.
        while (front <= back and v[dq[back]] >= v[i]) back--;

        // Adaug elementul pe ultima pozitie (cel mai recent)
        dq[++back] = i;

        // Daca s-au citit deja k numere, atunci adauga la suma
        if (i >= k - 1) {
            sum += v[dq[front]];
        }

        // Daca minimul a devenit atat de vechi incat va fi inutilizabil la urmatorul pas, atunci sterge-l
        if (i - dq[front] + 1 >= k) front++;
    }

    cout << sum;
    return 0;
}