Cod sursa(job #2630596)

Utilizator Stefan4814Voicila Stefan Stefan4814 Data 26 iunie 2020 13:16:23
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int n, i, v[5000001], k;
long long s;
deque<int> deq;
///     in mare ideea este urmatoarea, desi imi e greu sa o explic in cuvinte:
///     intr-un deque am salvat pozitia minimului dintr-o subsecventa de k elemente
///     iar apoi comparam al k + 1 - lea element cu cel mai mic element din "seria" trecuta de k elemente
///     daca minimul dintre acele element e fix primul element din acel subsir de k elemente(deci nu face parte din acelasi subsir cu k + 1)
///     ii eliminam pozitia din deque
int main() {
    fin >> n >> k;
    for(i = 1; i <= k; i++) {
        fin >> v[i];
        while(!deq.empty() && v[i] <= v[deq.back()]) {
            deq.pop_back();
        }
        deq.push_back(i);
    } ///punem in deque prima pozitie a minimului primelor k elemente
    s = v[deq.front()];
    for(i = k + 1; i <= n; i++) {
        fin >> v[i];
        while(!deq.empty() && v[i] <= v[deq.back()])
            ///cat timp elemnetul curent e mai mic decat ultimul element al carui indice e in coada eliminam indicele din coada
            deq.pop_back();
        deq.push_back(i); ///aduagam elementul curent(care este cel minim)
        if(deq.front() <= i - k) { ///daca primul element ramas in coada este mai mic decat i - k inseamna ca asta era pozitia minimului din seria anterioara si, de aceea, il eliminam
            deq.pop_front();
        }
        s += v[deq.front()];
    }
    fout << s;
    return 0;
}