Cod sursa(job #2617427)

Utilizator Zamfirescuste2Zamfirescu Stefan Zamfirescuste2 Data 21 mai 2020 18:14:53
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("deque.in");
ofstream g("deque.out");
class Deque{
    int *coada;
    int front;
    int back;
public: 
    Deque(int n);

    void push_front(int val);
    void push_back(int val);

    void pop_front();
    void pop_back();
    int get_front();
    int get_back();
    bool is_empty();
};

bool Deque :: is_empty(){
    if( front > back )
        return true;
    return false;
}

Deque :: Deque(int n){
    front = 0;
    back = -1;
    coada = new int[n];
}

void Deque :: push_front(int val){
    if( front > 0 ){
        --front;
        coada[front] = val;
    }
}

void Deque :: push_back(int val){
    ++back;
    coada[back] = val;
} 

void Deque :: pop_front(){
    ++front;
}

void Deque :: pop_back(){
    --back;
}

int Deque :: get_front(){
    return coada[front];   
}

int Deque :: get_back(){
    return coada[back];
}


int main(){

    int n, k, x; 
    vector <int> elem;   
    long long suma = 0;
    
    f >> n >> k;
    
    Deque deque(n);
    elem.reserve(n);
    int i = 0;
    
    while( i < n ){
        f >> x;
        elem.push_back(x);
        ++i;
    }

    deque.push_back(0);

    for(int i = 1; i < n; i++ ){

        while( !deque.is_empty() && elem[i] <= elem[deque.get_back()]){
            deque.pop_back();
        }
        
        deque.push_back(i);

        if( i >= k - 1){
            suma += elem[deque.get_front()];
        }

        if(!deque.is_empty() && deque.get_front() == i - k + 1)
            deque.pop_front();
    }

    g << suma;

}