Cod sursa(job #2615001)

Utilizator paulaiugaPaula Iuga paulaiuga Data 13 mai 2020 13:43:33
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

ifstream in("deque.in");
ofstream out("deque.out");

//pt fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime
class Deque
{

private:
    int *coada;
    int fata;
    int spate;

public:
    Deque(int n = 5000000)
    {
        fata = 0;
        spate = -1;
        coada = new int[n];
    }

    ~Deque()
    {
        fata = 0;
        spate = -1;
        delete []coada;
    }

    void insereaza_fata(int val)
    {
        if(fata>0)
        {
            fata--;

            coada[fata] = val;
        }

    }

    void insereaza_spate(int val)
    {

        spate++;

        coada[spate] = val;
    }

    bool isempty()
    {
        if(fata > spate)
            return true;

        return false;
    }

    void sterge_fata()
    {

        fata++; //se sterge primul elem;

    }


    void sterge_spate()
    {


        spate = spate -1;//se sterge ultimul elem;

    }

    int get_fata()
    {
        return coada[fata];
    }

    int get_spate()
    {
        return coada[spate];
    }



};
int main()
{
    //minimul mereu in vf deque ului;

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

//    for (auto it = elem.begin(); it != elem.end(); it++)
//        cout << *it << " ";

    dcoada.insereaza_spate(0);

    for(int i = 1; i<n; i++)
    {
        //Cat timp elementul curent este mai mic decat ultimul element din deque se elim ultimul elem;
        while(!dcoada.isempty() && elem[i]<= elem[dcoada.get_spate()])
        {
            dcoada.sterge_spate();
        }

        dcoada.insereaza_spate(i);//se adauga in spate ultimul element;


        if(i>= k -1)//se adauga minimul la suma;
        {
            suma += elem[dcoada.get_fata()];
            //cout<< elem[dcoada.get_fata()]<<" ";

        }

        if(!dcoada.isempty() && dcoada.get_fata() == i-k+1)// Daca elementul minim coincide cu cel de pe pozita i-K, se sterge pozitia lui din deque;
            dcoada.sterge_fata();

    }

    //cout<<"\n"<<suma;
    out<<suma;
    in.close();
    out.close();
    return 0;
}