Cod sursa(job #2217695)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 1 iulie 2018 15:48:34
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>

using namespace std;

struct Node{
    int value;
    Node *prev, *next;
};

class Deque{
public:
    Deque(){
        first = nullptr;
        last = nullptr;
    }
    int Empty(){
        if(first == nullptr)
            return 1;
        return 0;
    }
    void PushFirst(int value){
        Node *aux = new Node;
        aux->value = value;
        if(nullptr == first){
            aux->prev = aux->next = nullptr;
            first = last = aux;
            return;
        }
        aux->prev = nullptr;
        aux->next = first;
        first->prev = aux;
        first = aux;
        return;
    }
    void PushLast(int value){
        Node *aux = new Node;
        aux->value = value;
        if(nullptr == first){
            aux->prev = aux->next = nullptr;
            first = last = aux;
            return;
        }
        aux->next = nullptr;
        aux->prev = last;
        last->next = aux;
        last = aux;
        return;
    }
    void PopFirst(){
        if(first == last){
            delete first;
            first = last = nullptr;
            return;
        }
        Node *aux = first;
        first = first->next;
        first->prev = nullptr;
        delete aux;
    }
    void PopLast(){
        if(first == last){
            delete first;
            first = last = nullptr;
            return;
        }
        Node *aux = last;
        last = last->prev;
        last->next = nullptr;
        delete aux;
    }
    int GetFirst(){
        return first->value;
    }
    int GetLast(){
        return last->value;
    }
private:
    Node *first;
    Node *last;
};

const int NMax = 5000003;

int n,k;
int a[NMax];

int main(){
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);

    scanf("%d%d",&n,&k);
    for(int i = 1; i <= n; ++i)
        scanf("%d",&a[i]);

    Deque *deq = new Deque;
    long long ans = 0;
    for(int i = 1; i <= n; ++i){
        if(deq->Empty()){
            deq->PushLast(i);
            continue;
        }
        if(i - k + 1 > deq->GetFirst())
            deq->PopFirst();
        while(!deq->Empty() && a[i] <= a[deq->GetLast()])
            deq->PopLast();
        deq->PushLast(i);
        if(i >= k)
            ans += 1LL*a[deq->GetFirst()];
    }
    printf("%lld\n",ans);
    return 0;
}