Cod sursa(job #2047562)

Utilizator zhm248Mustatea Radu zhm248 Data 24 octombrie 2017 23:28:26
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
unsigned int v[1<<21];
int vv[1<<21],f[1<<21];
const int p=65537;
vector<unsigned int>g1[p+1];
vector<unsigned int>g2[p+1];
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    int l,u,n,i,nr=0,j;
    long long nrl=0,nru=0;
    scanf("%d%d%d",&n,&l,&u);
    for(i=1; i<=n; ++i)
    {
        scanf("%u",&v[i]);
        bool ok=0;
        for(j=0; j<g1[v[i]%p].size(); ++j)
        {
            if(g1[v[i]%p][j]==v[i])
            {
                vv[i]=g2[v[i]%p][j];
                ok=1;
                break;
            }
        }
        if(!ok)
        {
            g1[v[i]%p].push_back(v[i]);
            g2[v[i]%p].push_back(++nr);
            vv[i]=nr;
        }
    }
    if(l>1)
    {
        int poz=1;
        nr=0;
        nrl=(1LL*l*(l-1))/2;
        for(i=1; i<=l-1; ++i)
        {
            if(!f[vv[i]])
                nr++;
            f[vv[i]]++;
        }
        for(i=l; i<=n; ++i)
        {
            if(!f[vv[i]])
                nr++;
            f[vv[i]]++;
            if(nr==l)
            {
                while(nr==l)
                {
                    f[vv[poz]]--;
                    if(!f[vv[poz]])
                        nr--;
                    poz++;
                }
            }
            nrl+=(long long)(i+1-poz);
        }
    }
    memset(f,0,sizeof(f));
    int poz=1;
    nr=0;
    nru=(1LL*u*(u+1))/2;
    for(i=1; i<=u; ++i)
    {
        if(!f[vv[i]])
            nr++;
        f[vv[i]]++;
    }
    for(i=u+1; i<=n; ++i)
    {
        if(!f[vv[i]])
            nr++;
        f[vv[i]]++;
        if(nr==u+1)
        {
            while(nr==u+1)
            {
                f[vv[poz]]--;
                if(!f[vv[poz]])
                    nr--;
                poz++;
            }
        }
        nru+=(long long)(i+1-poz);
    }
    printf("%lld\n",nru-nrl);
    return 0;
}