Cod sursa(job #3126685)

Utilizator raresp19Papusoi Rares raresp19 Data 6 mai 2023 20:54:48
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.81 kb
#include <iostream>
#include <fstream>

using namespace std;

struct Nod {
    struct Nod* prev;
    struct Nod* next;
    int valoare;
};

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

    return newnode;
}

class Deque{
    Nod* front;
    Nod* back;
    int size;

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

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

        ++size;
    }

    void pushBack(int x){
        Nod* 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 {
            front = front->next;
            delete front->prev;
            front->prev = NULL;
        }

        --size;
    }

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

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

        --size;
    }

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

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

        return 0;
    }

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

        return 0;
    }

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

    ~Deque(){
        while (front != back){
            front = front->next;
            delete front->prev;
        }

        delete front;
    }

};

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



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

    {   Deque de;

        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;
}