Cod sursa(job #2887033)

Utilizator kanyjmkSabau Eduard kanyjmk Data 8 aprilie 2022 18:24:57
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");

struct Node
{
    Node* next;
    Node* prev;
    int value;
    Node(int x) {value = x; prev = next = NULL;}
};
class Deque
{
public:
    Deque() {d_begin = d_end = NULL; d_size = 0;}
    void dpush_back(int);
    void dpush_front(int);
    void dpop_back();
    void dpop_front();
    int dfront();
    int dback();
    bool dis_empty();
private:
    Node* d_begin;
    Node* d_end;
    unsigned d_size;
};
void Deque::dpush_back(int x)
{
    Node* temp = new Node(x);
    if(d_size == 0)
        d_begin = d_end = temp;
    else
    {
        d_end->next = temp;
        temp->prev = d_end;
        d_end = temp;
    }
    d_size++;
}
void Deque::dpush_front(int x)
{
    Node* temp = new Node(x);
    if(d_size == 0)
        d_begin = d_end = temp;
    else
    {
       temp->next = d_begin;
       d_begin->prev = temp;
       d_begin = temp;
    }
    d_size++;
}
void Deque::dpop_back()
{
    if(d_size > 1)
    {
        Node* temp = d_end;
        d_end = d_end->prev;
        delete temp;
    }
    else if(d_size == 1)
    {
        delete d_end;
        d_end = d_begin = NULL;
    }
    d_size--;
}
void Deque::dpop_front()
{
    if(d_size > 1)
    {
        Node* temp = d_begin;
        d_begin = d_begin->next;
        delete temp;
    }
    else if(d_size == 1)
    {
        delete d_begin;
        d_end = d_begin = NULL;
    }
    d_size--;
}
int Deque::dfront()
{
    if(d_size)
        return d_begin->value;
}
int Deque::dback()
{
    if(d_size)
        return d_end->value;
}
bool Deque::dis_empty()
{
    if(d_size)
        return false;
    return true;
}
int main()
{
    Deque deq;
    unsigned n, k;
    long long sum;
    sum = 0;
    fin >> n >> k;
    int* v = new int[n];
    for(unsigned i = 0; i < n; i++)
    {
        fin >> v[i];

        while(!deq.dis_empty() && v[i] <= v[deq.dback()])
                deq.dpop_back();

        deq.dpush_back(i);

        if(deq.dfront() == i-k)
            deq.dpop_front();

        if(i >= k-1)
           sum += v[deq.dfront()];
    }
    fout << sum;
    return 0;
}