Cod sursa(job #3126486)

Utilizator RealDream21Fabian-Andrei RealDream21 Data 6 mai 2023 17:54:35
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

const int  NMAX = 60000005;

class Deque {
    long long  i, j;
public:
    long long  *v;
    Deque();
    void push_back(long long  a);
    void pop_back();
    long long  back();
    void push_front(long long  a);
    void pop_front();
    long long  front();
    bool empty();
};

int main() {
    ifstream fin("deque.in");
    ofstream fout("deque.out");

    Deque myDeque;
    long long  n, k, x;
    long long  *v = new long long [NMAX];
    long long  sum = 0;

    fin >> n >> k;
    for (long long  i = 0; i < n; i++)
        fin >> v[i];

    for (long long  i = 0; i < n; i++) {
        if (!myDeque.empty() && myDeque.front() <= i - k)
            myDeque.pop_front();

        while (!myDeque.empty() && v[i] < v[myDeque.back()])
            myDeque.pop_back();

        myDeque.push_back(i);

        if (i >= k - 1) {
            sum += v[myDeque.front()];
            if (myDeque.front() == i - k + 1)
                myDeque.pop_front();
        }
    }
    fout << sum << "\n";
    return 0;
}

Deque::Deque() {
    j = 0;
    i = 0;
    v = new long long [NMAX];
}

void Deque::push_back(long long  a) {
    v[j] = a;
    j = (j + 1) % NMAX;
}

void Deque::pop_back() {
    if (!empty())
        j = (j - 1 + NMAX) % NMAX;
}

long long  Deque::back() {
    if (!empty())
        return v[(j - 1 + NMAX) % NMAX];
    return INT_MIN;
}

void Deque::push_front(long long  a) {
    i = (i - 1 + NMAX) % NMAX;
    v[i] = a;
}

void Deque::pop_front() {
    if(!empty())
        i = (i + 1) % NMAX;
}

long long  Deque::front() {
    if (!empty())
        return v[i];
    return INT_MAX;
}

bool Deque::empty() {
    if (i == j)
        return true;
    return false;
}