Cod sursa(job #1506627)

Utilizator codi22FMI Condrea Florin codi22 Data 20 octombrie 2015 20:45:47
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
/*#include <iostream>
#include <cstdio>
using namespace std;
#include <deque>
long long n,x,l,i,k,y,j;
int main()
{
    deque<long long> a,b;
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
    cin>>n>>k;
    cin>>x;
    a.push_back(x);
    b.push_back(1);
    l=1;
    for (i=1;i<k;i++)
    {
        cin>>x;
        while (x<=a[l-1]&&l>0)
        {
            a.pop_back();
            b.pop_back();
            l--;
        }
        a.push_back(x);
        b.push_back(i+1);
        l++;
    }
    y=a[0];

    for (i=k;i<n;i++)
    {  /* cout<<i<<" ";
        for (j=0;j<l;j++)
        {
            cout<<"("<<a[j]<<" , "<<b[j]<<") ";
        }
        cout<<'\n';
        cin>>x;
        if (i-b[0]==k-1&&l!=0)
        {
            l--;
            a.pop_front();
            b.pop_front();
        }

        while (x<=a[l-1]&&l>0)
        {
            a.pop_back();
            b.pop_back();
            l--;
        }
        a.push_back(x);
        b.push_back(i+1);
        l++;
        y+=a[0];

    }
   /*  for (j=0;j<l;j++)
        {
            cout<<"("<<a[j]<<" , "<<b[j]<<") ";
        }
   cout<<y;
}*/
#include <stdio.h>

#define maxn 5000010

int N, K;
int A[maxn], Deque[maxn];
int Front, Back;
long long Sum;

int main()
{
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);

    int i;

    scanf("%d %d ", &N, &K);

    // Citesc sirul dat

    for (i = 1; i <= N; i++)
        scanf("%d ", &A[i]);

    Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid

    for (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--;
        // Adaugam pozitia elementului curent in deque
        Deque[++Back] = i;

        // Daca elementul minim 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++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (i >= K) Sum += A[ Deque[Front]];
    }

    printf("%lld\n", Sum);

    return 0;
}