Cod sursa(job #2907179)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 29 mai 2022 02:31:32
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.43 kb
#include <iostream>
#include <vector>
#include <fstream>
 
const int nrMax(1048581), nmb(500009);
std::vector<std::pair<unsigned int, int> > vec[nmb];
unsigned int vector[nrMax];
 
int n, L, U, nrD;
void adauga(unsigned int v, int add){
    int poz = v % nmb;
    for(auto &pair: vec[poz])
        if(pair.first == v){
            pair.second += add;
            if(pair.second == 0)
                --nrD;
            else if(pair.second == 1 && add == 1)
                ++nrD;
            return;
        }
    ++nrD;
    vec[poz].push_back({v, 1});
}
 
long long numarSecvente(int lim)
{
    if(lim == 0)
        return 0;
    for(int i = 0; i < nmb; ++i)
        vec[i].clear();
    int p1 = 1, p2 = 1;
    long long subSec = 1;
    nrD = 0;
    adauga(vector[p1], 1);
    while(p2 < n)
    {
        ++p2;
        adauga(vector[p2], 1);
        if(nrD <= lim)
            subSec += p2 - p1 + 1;
        else
        {
            while(p1 <= p2 && nrD > lim)
            {
                adauga(vector[p1], -1);
                ++p1;
            }
            subSec += p2 - p1 + 1;
        }
    }
    return subSec;
}
 
int main()
{
 
    std::ifstream f("secv5.in");
    std::ofstream g("secv5.out");
    f >> n >> L >> U;
 
    for(int i = 1; i <= n; ++i)
        f >> vector[i];
 
    g << numarSecvente(U) - numarSecvente(L - 1) << '\n';
    f.close();
    g.close();
    return 0;
}