Cod sursa(job #3126585)

Utilizator raresp19Papusoi Rares raresp19 Data 6 mai 2023 19:29:34
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.71 kb
#include <iostream>
#include <fstream>

using namespace std;

typedef struct Nod {
    struct Nod* prev;
    struct Nod* next;
    long long valoare;
}Nod, *PNod;

PNod createNod(long long int valoare){
    PNod newnode = new Nod;
    newnode->valoare = valoare;
    newnode->prev = NULL;
    newnode->next = NULL;

    return newnode;
}

class Deque{
    int a[5000010];
    PNod front;
    PNod back;
    long long size;

public:
    Deque(){
        this->front = NULL;
        this->back = NULL;
        this->size = 0;
    }

    void pushFront(long long int x){
        PNod nou = createNod(x);
        if (size == 0){
            front = nou;
            back = nou;
        } else {
            nou->next = front;
            front->prev = nou;
            this->front = nou;
        }

        ++size;
    }

    void pushBack(long long int x){
        PNod nou = createNod(x);
        if (size == 0){
            front = nou;
            back = nou;
        } else {
            nou->prev = back;
            back->next = nou;
            back = nou;
        }

        ++size;
    }

    void popFront() {
        if (size == 0)
            return;

        if (front == back){
            delete front;
            front = NULL;
            back = NULL;
        }
        else {
            PNod temp = front->next;
            temp->prev = NULL;
            delete front;
            front = temp;
        }

        size--;
    }

    void popBack() {
        if (size == 0)
            return;

        if (front == back){
            delete front;
            front = NULL;
            back = NULL;
        }
        else {
            PNod temp = back->prev;
            temp->next = NULL;
            delete back;
            back = temp;
        }

        size--;
    }

    void printfromFront() {
        PNod parcurgere = front;
        while (parcurgere != NULL){
            cout<<parcurgere->valoare<<" ";
            parcurgere = parcurgere->next;
        }
    }

    long long int getFront() {
        if (front != NULL)
            return front->valoare;
    }

    long long int getBack() {
        if (back != NULL)
            return back->valoare;
    }

    long long int getSize() {return this->size;}

};

Deque de;
long long a[5000030];
long long n, k;
long long s = 0;



int main() {

    ifstream f("deque.in");
    ofstream g("deque.out");

    f>>n>>k;

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

    for (int i=1; i<=n; i++){
        while (de.getSize() != 0 && a[i] < de.getBack())
            de.popBack();
        de.pushBack(a[i]);

        if (i >= k && de.getFront() == a[i - k])
            de.popFront();

        if (i >= k)
            s += de.getFront();
    }

    g<<s;

    f.close();
    g.close();
    return 0;
}