Cod sursa(job #3127631)

Utilizator fanevodaCalota Stefan fanevoda Data 7 mai 2023 17:03:59
Problema Deque Scor 25
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.29 kb
#include <iostream>
#include <stack>
#include <fstream>
#include <vector>


std::ifstream in("deque.in");
std::ofstream out("deque.out");

class Deque
{
private:

    long long capacity = 0;

    struct Node
    {
        Node(int cheie) : key(cheie), next(nullptr), prev(nullptr) {}

        int key;
        Node* next;
        Node* prev;
    };

    Node* front;
    Node* rear;


public:
    Deque() : front(nullptr), rear(nullptr), capacity(0) {}

    void push_front(int x)
    {
        capacity++;

        Node* new_el = new Node(x);

        if (front == nullptr || rear == nullptr)
        {
            front = new_el;
            rear = new_el;
        }
        else
        {
            new_el->next = front;
            front->prev = new_el;
            front = new_el;
        }
    }

    void push_rear(long long x)
    {
        capacity++;

        Node* new_el = new Node(x);

        if (front == nullptr || rear == nullptr)
        {
            front = new_el;
            rear = new_el;
        }
        else
        {
            new_el->prev = rear;
            rear->next = new_el;
            rear = new_el;
        }
    }

    void pop_front()
    {
        capacity--;

        Node* aux = front;

        if (front == nullptr || rear == nullptr)
            rear = nullptr;
        else
        {
            if (front->next != nullptr)
            {
                front = front->next;
                front->prev = nullptr;
            }
            else
            {
                front = nullptr;
                rear = nullptr;
            }
        }
    }

    bool empty()
    {
        return front == nullptr;
    }

    void pop_rear()
    {
        capacity--;

        Node* aux = rear;
        
        if (rear == nullptr)
        {
            rear = nullptr;
            front = nullptr;
        }
        else
        {
            if (rear->prev != nullptr)
            {
                rear = rear->prev;
                rear->next = nullptr;
            }
            else
            {
                rear = nullptr;
                front = nullptr;
            }
        }

    }

    int get_front()
    {
        return front->key;
    }

    long long int get_rear()
    {
        return rear->key;
    }

    long long int get_capacity()
    {
        return capacity;
    }

    void printIt()
    {
        Node* eu = front;
        while (eu != nullptr)
        {
            out << eu->key << " ";
            eu = eu->next;
        }
        out << std::endl;
    }

};

int main()
{
    long long int n,k;

    int s = 0;

    in >> n >> k;


    std::vector<int> v;

    Deque deq;


    
    for (long long i = 0; i < n; i++)
    {
        int x;
        in >> x;
        v.push_back(x);
    }

    
    for (long long i = 0; i < n; i++)
    {

        while ( !deq.empty() && v[i] <= v[deq.get_rear()]) 
            deq.pop_rear();

        
        if (!deq.empty() && deq.get_front() == i - k)
            deq.pop_front();
           

        deq.push_rear(i);
        

        if (i >= k - 1)
            s += v[deq.get_front()];
        
    }

    out << s;
    return 0;

}