Cod sursa(job #2722700)

Utilizator dana24hdDana N dana24hd Data 13 martie 2021 10:58:12
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int v[5000005];
int d[5000005];
long long suma;

int main()
{
    /**

    DEQUE

    v= 7 5 8 9 6 14 5 11 4

    d= 7                  5   8 9 6                    14                         5
       elim de catre 5  d[p]      ii scoate pe 8 si 9  k elem=> il scoate pe 5    elimina tot

    elementele sunt eliminate cand:
        1 vine un element mai mic
        2 au trecut deja k elemente

    ! deque cu indici, nu valori => verif si cand au trecut k elemente

    suma= 5+5+6+5+5+4





        1   2   3   4   5   6         k=3
    v=  7  11  20  21  30  45

    d=                       1   2   3   4   5   6
       prea vechi=>scoatem   x   x                  =>scoatem elem >= v[i] (nu pot fi minime)


    de la i-k+1 la i



    OBS! elementele sunt mereu crescatoare

    v[ d[p] ] < v[ d[p+1] ] < ... < v[ d[u] ]

    !!!! d[p] >= d[u] - k + 1


    **/

    int n, k;
    in>>n>>k;
    for(int i=1; i<=n; i++){
        in>>v[i];
    }

    int p, u;
    p=1;
    u=1;
    d[1]=1;
    if(k==1){
        suma+=v[1];
    }

    for(int i=1; i<=n; i++){
        /// i-k+1 ..... i
        while( p<=u && v[ d[u] ]>=v[i] )
            u--;

        if( p<=u && d[p]<i-k+1 )
            p++;

        u++;
        d[u]=i;

        if(i>=k)
            suma=suma+v[ d[p] ];

    }


    out<<suma;


    return 0;
}