Cod sursa(job #1051743)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 10 decembrie 2013 15:50:02
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <map>
using namespace std;

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

const int NMAX = (1<<20) + 1;
const int HASHKEY = 1666013;

map<unsigned int, int> Hash;

unsigned int V[NMAX], N, U, L;

bool addToHash(unsigned int value){

    Hash[value]++;

    if(Hash[value] > 1){
        return false;
    }

    return true; //new element
}

bool eraseFromHash(unsigned int value){
    Hash[value]--;

    if(Hash[value] > 0){
        return false;
    }

    return true;//element does not exist in the hash from now
}

long long resolve(unsigned int maxCounter){
    unsigned int i, distinctElements = 0;

    long long sol=0;

    unsigned int left = 0, right = 0;

    Hash.clear();

    for(; right < N; right++){
        if(addToHash(V[right])){
            distinctElements++;
        }

        while(distinctElements > maxCounter ){
            if(eraseFromHash(V[left])){
                distinctElements--;
            }

            left++;
        }

        if(distinctElements <= maxCounter)
            sol += right - left + 1;
    }
    return sol;

}

int main()
{
    in >> N >> U >> L;


    for(int i = 0 ; i < N; i++){
        in >> V[i];
    }
    long long Lsol = resolve(L);
    long long Usol = resolve(U-1);
    out << Lsol - Usol;
    return 0;
}