Cod sursa(job #2293006)

Utilizator sebi_info1Olaru Sebastian sebi_info1 Data 30 noiembrie 2018 13:29:49
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <queue>
#include <fstream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
const int Nmax = 5000001;
int n, k, A[Nmax];
deque <int> D;
long long Sum;
int main()
{   f>>n>>k;
    for(int i=1;i<=n;++i) f>>A[i];
    for(int i=1;i<=n;++i)
    {   while(!D.empty() &&  A[i]<=A[D.back()]) D.pop_back();
        D.push_back(i);
        if(D.front() == i-k) D.pop_front();
        if(i >= k) Sum += A[D.front()];
    }
    g<<Sum<<'\n'; g.close(); return 0;
}
/*#include <fstream>
#define Nmax 5000010
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int n, k, A[Nmax], Deque[Nmax];
long long Sum;
int main()
{   f>>n>>k;
    for(int i=1;i<=n;++i) f>>A[i];
    int Front=1,Back=0; /// Initializare, Back < Front => deque-ul este vid
    for(int i=1;i<=n;++i)
    {    /// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
        while(Front<=Back && A[i]<=A[Deque[Back]]) Back--;
        Deque[++Back]=i; /// Adaugam pozitia elementului curent in deque
        /// Daca elementul minim aflat in varful deque-ului coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
        if (Deque[Front]==i-k) Front++;
        if (i>=k) Sum+=A[Deque[Front]];      /// insumam minimul, care se afla in varful deque-ului
    }
    g<<Sum<<'\n'; g.close(); return 0;
}
*/