Cod sursa(job #1067689)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 27 decembrie 2013 12:52:55
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<cstring>
#include<vector>

using namespace std;

const int NMAX = 1048576+4;
const int MOD = 666013;
typedef pair<unsigned int,int> PUI;

int N,L,U,norm;
int A[NMAX];
vector<PUI> H[MOD+5];
int V[NMAX];
long long sol;

int rechercher(unsigned int x)
{
    unsigned int r=x%MOD;
    vector<PUI>::iterator it;
    for(it=H[r].begin();it!=H[r].end();it++)
        if(it->first == x) return it->second;
    norm++;
    H[r].push_back(make_pair(x,norm));
    return norm;
}

int main()
{
    int i,j,Nr;
    unsigned int a;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&N,&L,&U);
    for(i=1;i<=N;i++)
    {
        scanf("%u",&a);
        A[i]=rechercher(a);
    }
    Nr=0;
    j=1;
    for(i=1;i<=N;i++)
    {
        V[A[i]]++;
        if(V[A[i]]==1) Nr++;
        for(; j<=i; j++)
        {
            if(Nr<=U) break;
            V[A[j]]--;
            if(V[A[j]]==0) Nr--;
        }
        sol+=(i-j+1);
    }
    memset(V,0,sizeof(V));
    Nr=0;
    j=1;
    for(i=1;i<=N;i++)
    {
        V[A[i]]++;
        if(V[A[i]]==1) Nr++;
        for(; j<=i; j++)
        {
            if(Nr<=L-1) break;
            V[A[j]]--;
            if(V[A[j]]==0) Nr--;
        }
        sol-=(i-j+1);
    }
    printf("%lld\n",sol);
    return 0;
}