Cod sursa(job #332045)

Utilizator freak93Adrian Budau freak93 Data 16 iulie 2009 12:48:50
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<cstring>
#include<cstdio>
#include<vector>

using namespace std;

const unsigned int maxn=1200000;
const unsigned int mod=479909;

struct nod
{
    unsigned int v;
    unsigned int ord;
};

vector<nod>hash[mod];

unsigned int n,i,a[maxn],x,p=1024,l,u,numbers,q,v[maxn],l1[maxn],l2[maxn];

char s[1024];

void cit(unsigned int &x)
{
    x=0;
    if(p==1024)
        fread(s,1,1024,stdin),p=0;
    while(s[p]<'0'||s[p]>'9')
    {
        ++p;
        if(p==1024)
            fread(s,1,1024,stdin),p=0;
    }
    while(s[p]>='0'&&s[p]<='9')
    {
        x=(x<<1)+(x<<3)+s[p]-'0';
        ++p;
        if(p==1024)
            fread(s,1,1024,stdin),p=0;
    }
}

inline unsigned int insert(unsigned int x)
{
    unsigned int list=x%mod;
    vector<nod>::iterator it;
    for(it=hash[list].begin();it!=hash[list].end();++it)
        if(it->v==x)
            break;
    if(it==hash[list].end())
    {
        nod k;
        k.v=x;
        k.ord=++numbers;
        hash[list].push_back(k);
        return numbers;
    }
    return it->ord;
}

long long rez;

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    cit(n);
    cit(l);
    cit(u);
    for(i=1;i<=n;++i)
    {
        cit(x);
        a[i]=insert(x);

    }
    --l;

    l1[1]=1;
    v[a[1]]=1;
    unsigned int nr=1;
    for(i=2;i<=n;++i)
    {
        l1[i]=l1[i-1];
        if(v[a[i]]==0)
            ++nr;
        ++v[a[i]];
        while(nr>u)
        {
            --v[a[l1[i]]];
            if(v[a[l1[i]]]==0)
                --nr;
            ++l1[i];
        }
    }

    memset(v,0,sizeof(v));

    if(l>0)
    {
    l2[1]=1;
    v[a[1]]=1;
    nr=1;}
    else
    {
        l2[1]=2;
        nr=0;
    }
    for(i=2;i<=n;++i)
    {
        l2[i]=l2[i-1];
        if(v[a[i]]==0)
            ++nr;
        ++v[a[i]];
        while(nr>l)
        {
            --v[a[l2[i]]];
            if(v[a[l2[i]]]==0)
                --nr;
            ++l2[i];
        }
    }

    for(i=1;i<=n;++i)
        rez+=l2[i]-l1[i];

    printf("%lld\n",rez);

    fclose(stdin);
    fclose(stdout);

    return 0;
}