Cod sursa(job #735924)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 17 aprilie 2012 15:46:42
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <deque>
#define type long long
#define NM 5000010

using namespace std;

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

deque<int> D;
int n,k,i,x,V[NM];
type ANS=0;

void PushInDeque(int i) // Introduc numarul in Deque, in spate
{
    while (!D.empty() && V[D.back()]>=V[i]) D.pop_back(); // Cat timp am numere in Deque, iar numarul din spate e mai mare decat numarul curent scot din capat
    D.push_back(i);
    return;
}

void PopDeque(int i)
{
    while (!D.empty() && D.front()<=i-k) D.pop_front(); // Cat timp am numere in Deque, iar elementul din fata nu se afla in subsecventa de lungime k ce se termina pe pozitia i scot din fata
    return;
}

int MinSub() {
    if (!D.empty()) return V[D.front()]; // In fata voi avea minimul din subsecventa de lungime k ce se termina pe pozitia i
    return 0;
}

int main()
{
    f >> n >> k;
    for (i=1;i<=n;i++) f >> V[i];

    for (i=1;i<k;i++)
        PushInDeque(i);

    for (i=k;i<=n;i++)
    {
        PopDeque(i);
        PushInDeque(i);
        ANS+=MinSub();
    }

    g << ANS << '\n';

    f.close();g.close();
    return 0;
}