Cod sursa(job #1528429)

Utilizator margikiMargeloiu Andrei margiki Data 19 noiembrie 2015 18:11:25
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
# include <fstream>
# include <algorithm>
# include <vector>
# define MOD 666013
# define NR 1100000
# define f first
# define s second
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
vector <pair <unsigned int, int > > v[MOD+5];
int i,j,n,m,L,U;
int cod[NR];
unsigned int A[NR];
int num (unsigned int K, int I) {

    for (int i=0; i<v[cod[I]].size(); ++i)
        if (v[cod[I]][i].f==K) return v[cod[I]][i].s;

    return 0;
}
void update (unsigned int K, int X, int I) {

    for (int i=0; i<v[cod[I]].size(); ++i)
        if (v[cod[I]][i].f==K) {
            v[cod[I]][i].s+=X;
            return;
        }

    v[cod[I]].push_back(make_pair(K, 1));
}
// numarul de secvente cu pana la L elemente diferite
long long numara (int L) {
    long long sol=0, Edif=0;
    int ci=1; Edif=1; update (A[1], 1, 1);
    if (L) sol=1;

    for (int i=2; i<=n; ++i) {
        update (A[i], 1, i); if (num(A[i], i)==1) ++Edif;
        while (Edif>L) {
            update (A[ci], -1, ci);
            if (num(A[ci], ci)==0) --Edif;
            ++ci;
        }
        sol+=i-ci+1;
    }
    //curat
    while (ci<=n) {
        update(A[ci], -1,ci);
        ++ci;
    }

    return sol;
}
int main ()
{
    f>>n>>L>>U;
    for (i=1; i<=n; ++i)
    {f>>A[i]; cod[i]=A[i]%MOD;}

    g<<numara(U)-numara(L-1);

    return 0;
}