Cod sursa(job #797579)

Utilizator mihai995mihai995 mihai995 Data 14 octombrie 2012 13:57:42
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <cstring>
using namespace std;

const int N = 1 << 20, K = 1299827;

struct HashTable{
    unsigned int hash[K];

    int h(unsigned int x, int i){
        return (x + i * i) % K;
    }

    bool hash_here(unsigned int x, int i){
        int q = h(x, i);

        return !hash[q] || hash[q] == x;
    }

    int get_key(unsigned int x){
        int i = 0;

        while (hash[h(x, i)] != x)
            i++;

        return h(x, i);
    }

    void insert(unsigned int val){
        int i = 0;

        while (!hash_here(val, i))
            i++;

        hash[h(val, i)] = val;
    }
};

struct CountingTable{
    int v[N], size;

    void reset(){
        memset(v, 0, sizeof(v));
        size = 0;
    }

    void insert(int x){
        if (!v[x])
            ++size;

        ++v[x];
    }

    void erase(int x){
        --v[x];

        if (!v[x])
            --size;
    }
};

HashTable H;
CountingTable T;

int v[N], n;

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

int solve(int D){
    T.reset();

    int sol = 0;

    for (int i = 1, j = 0 ; i <= n ; i++){
        while (j <= n && T.size <= D)
            T.insert(v[++j]);

        sol += j - i;

        T.erase(v[i]);
    }

    return sol;
}

int main(){
    int L, U;
    unsigned int x;

    in >> n >> L >> U;

    for (int i = 1 ; i <= n ; i++){
        in >> x; H.insert(x);
        v[i] = H.get_key(x);
    }


    out << solve(U) - solve(L - 1) << "\n";

    return 0;
}