Cod sursa(job #2217697)

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

using namespace std;

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

class Deque{
public:
    Deque(){
        first = nullptr;
        last = nullptr;
    }
    int Empty(){
        if(first == nullptr)
            return 1;
        return 0;
    }
    void PushFirst(int value, int ind){
        Node *aux = new Node;
        aux->value = value;
        aux->ind = ind;
        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, int ind){
        Node *aux = new Node;
        aux->value = value;
        aux->ind = ind;
        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 GetFirstValue(){
        return first->value;
    }
    int GetLastValue(){
        return last->value;
    }
    int GetFirstIndex(){
        return first->ind;
    }
    int GetLastIndex(){
        return last->ind;
    }
private:
    Node *first;
    Node *last;
};

const int NMax = 5000003;

int n,k;

int main(){
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
    scanf("%d%d",&n,&k);
    Deque *deq = new Deque;
    long long ans = 0;
    for(int i = 1; i <= n; ++i){
        int x;
        scanf("%d",&x);
        if(deq->Empty()){
            deq->PushLast(x,i);
            continue;
        }
        if(i - k + 1 > deq->GetFirstIndex())
            deq->PopFirst();
        while(!deq->Empty() && x <= deq->GetLastValue())
            deq->PopLast();
        deq->PushLast(x,i);
        if(i >= k)
            ans += 1LL*deq->GetFirstValue();
    }
    printf("%lld\n",ans);
    return 0;
}