Cod sursa(job #1554627)

Utilizator BaweeLazar Vlad Bawee Data 21 decembrie 2015 15:29:51
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <unordered_map>

using namespace std;

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

unordered_map<unsigned int, int> maparaie;

int n,l,u;
unsigned int a[1 << 20 + 1];

long long nrSecv(int x) // numara care subsecvente cu pana la L elemente distincte exista
{
    maparaie.clear();

    long long crnti = 1, sol = 0;
    for(int i = 1; i <= n; i++)
    {
        ++maparaie[a[i]];
        while(maparaie.size() > x)
        {
            --maparaie[a[crnti]];
            if(maparaie[a[crnti]] == 0)
                maparaie.erase(a[crnti]);
            ++crnti;
        }
        sol += i - crnti + 1; // la fiecare numar adaugat toate mai apar i subsecvente(la fiecare subsecventa actuala se adauga un nou elemnet)
    }                         // se scade crnti pt cazul in care exista subsecvente mai lungi ce trebuie scurtate
                              // crnti pleaca de la 1 pentu a se pastra proprietatea de subsecventa
    return sol;
}

int main()
{
    f >> n >> l >> u;

    for(int i = 1; i <= n; i++)
        f >> a[i];

    g << nrSecv(u) - nrSecv(l - 1);

    return 0;
}