Cod sursa(job #2880212)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 29 martie 2022 15:21:52
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <fstream>

using namespace std;

vector <unsigned int> v;
int n, l, u;

class Hash{
    int nr, p;
    vector <vector<unsigned int> > L;
public:
    Hash()
    {
        nr = 0;
        p = 666013;
        L.resize(p);
    }
    int GetSize()
    {
        return nr;
    }
    void Add(int x)
    {
        if (!Search(x))
            nr++;
        int r = x % p;
        L[r].push_back(x);
    }
    bool Search(int x)
    {
        int r = x % p;
        for (int i = 0; i < L[r].size(); i++)
            if (L[r][i] == x)
                return true;
        return false;
    }
    void Delete (int x)
    {
        int r = x % p;
        for (int i = 0; i < L[r].size(); i++)
            if (L[r][i] == x)
            {
                swap(L[r][i], L[r].back());
                L[r].pop_back();
            }
        if (!Search(x))
            nr--;
    }
};

void Read()
{
    ifstream fin ("secv5.in");
    fin >> n >> l >> u;
    v.resize(n);
    for (int i = 0; i < n; i++)
        fin >> v[i];
    fin.close();
}

void Solve()
{
    long long nrseqr, nrseql, i, j;
    nrseqr = nrseql = 0;
    j = 0;
    Hash h1, h2;
    for (i = 0; i < n; i++)
    {
        h1.Add(v[i]);
        //cout << h1.GetSize() << " " << i << " " << j << "\n";
        while (h1.GetSize() > u)
            h1.Delete(v[j++]);
        nrseqr += (i - j + 1);
    }
    j = 0;
    for (i = 0; i < n; i++)
    {
        h2.Add(v[i]);
        while (h2.GetSize() >= l)
            h2.Delete(v[j++]);
        nrseql += (i - j + 1);
    }
    ofstream fout ("secv5.out");
    fout << nrseqr - nrseql << "\n";
    fout.close();
}

int main() {

    Read();
    Solve();
    return 0;
}