Cod sursa(job #2773452)

Utilizator IoanaLiviaPopescu2Ioana Livia Popescu IoanaLiviaPopescu2 Data 6 septembrie 2021 23:10:04
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;


ifstream f("deque.in");
ofstream g("deque.out");
int main()
{
    int a[5000001] = {}, dq[5000001] = {}, n, k, front = 0, end = 0;
    long long sum = 0;
    //indexare de la 0
    //in dq voi retine indicii valorilor posibile ale minimului

    f>>n>>k;

    for(int i = 0 ; i < n; ++i)
        f>>a[i];

    for(int i = 0; i < n; ++i){
        //cat timp am elemente in dq si elementul curent din vector e mai mic decat cel din capat
        //practic caut sa inserez indexul astfel incat pe dq[end] sa raman cu minimul curent
        while(front <= end && a[i] <= a[dq[end]]){
            end--;
        }

        //adaug indicele gasit pe ++end, intrucat a iesit din for cand a[i] > a[dq[end]], iar ultima data scazusem end ul cu 1 in end--
        dq[++end] = i;

        //daca primul element din deque corespunde cu pozitia primului element din secventa curenta de k elem inseamna ca trebuie sa mutam frontul, elementul din front
        //urmand sa fie depasit la urmatorul pas, nevalabil pentru a fi luat in considerare ca minim curent
        if(dq[front] == i-k)  ++front;

        //daca nu suntem in prima secventa de k, adaugam primul element din deq intrucat este un minim valabil
        if(i + 1 >= k) sum += a[dq[front]];
    }

    g<<sum;

    f.close();

    g.close();


    return 0;
}