Cod sursa(job #1282058)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 3 decembrie 2014 22:15:19
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I 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;
}