Cod sursa(job #2829223)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 8 ianuarie 2022 13:42:27
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
#define DIMN 5000010
using namespace std;
int d[DIMN] , v[DIMN];
int main()
{
    FILE *fin = fopen ("deque.in" , "r");
    FILE *fout = fopen ("deque.out" , "w");
    int n , k , i , p , u;
    long long sol;
    fscanf (fin,"%d%d",&n,&k);
    for (i = 1 ; i <= n ; i++){
        fscanf (fin,"%d",&v[i]);
    }

    /// ne prefacem ca se cere minimul intre pozitiile 1 si i
    u = 0;
    p = 1; /// p = pe ce pozitie "incepe" structura de date

    sol = 0;

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

        /// vreau ca la finalul pasului curent
        /// sa obtin minimul din secventa
        /// de lungime k care se termina pe pozitia i
        /// daca aceasta secventa exista

        while (u >= p && v[i] <= v[d[u]]){
            u--;
        }

        d[++u] = i;

        if (i - d[p] + 1 > k){
            p++;
        }

        if (i >= k){ /// exista o seventa valida care se termina pe i
            sol += v[d[p]];

            //printf ("minimul din secventa de lungime k care se termina pe i = %d este %d\n", i , v[d[p]]);

        }

    }

    fprintf (fout,"%lld",sol);

    /// 2 [4 6 8] 10 12 , k = 3
    /// suntem la pasul i = 4
    /// 1 [2 3 4 ...

    /// eu sunt la pasul i = 4, solutia din d[1] = 1
    /// 4 - 1 + 1 == 4 adica valoarea de pe pozitia 1
    /// este minima pe o secventa mai mare decat k
    /// putem pur si simplu sa scoatem pozitia 1
    /// din structura

    return 0;
}