Cod sursa(job #2825450)

Utilizator AndreeaCreitaCreita Andreea AndreeaCreita Data 4 ianuarie 2022 19:07:48
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
//Se da un sir A cu N numere intregi.
//Pentru fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime.
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
//metoda sliding window
#define maxn 5000010
int arr[maxn], deq[maxn];  //arr e lista de nr, deq e coada dubla
int n,k;  //n e nr de elem, k nr de elem din subsir
int frt, bck;  //frt-front la deque, bck-back la deque
long long suma=0;
int main()
{
    //citire lista de numere
    in>>n>>k;
    int i;
    for( i=1;i<=n;i++)
        in>>arr[i];

    //deque e vida
    frt=1;
    bck=0;

    //
for(i=1;i<=n; ++i)
{

    while((frt<=bck) && (arr[i] < arr[deq[bck]]))   //in deque se stocheaza pozitiile (i), iar cand apeleaza arr[deq[bck]
        bck--;                                  //o sa ia, de fapt, elementul din arr al carui indice este in deque (adica ultimul el din deq)

    deq[++bck]=i; //adauga pozitia elem la finalul cozii

    if(deq[frt] + k == i)
        frt++;          //daca elem minim din deque nu mai apartine secventei k, il eliminam


    if(i>=k)
        suma += arr[deq[frt]];            //elem cel mai mic va fi mereu primul in deque

}
    out<<suma;
    return 0;
}