Cod sursa(job #332028)

Utilizator freak93Adrian Budau freak93 Data 16 iulie 2009 12:32:33
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<cstring>
#include<cstdio>
#include<vector>

using namespace std;

const int maxn=12000000;
const int mod=479909;

struct nod
{
    int v;
    int ord;
};

vector<nod>hash[mod];

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

char s[1024];

void cit(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 int insert(int x)
{
    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);
        ++v[a[i]];

    }
    --l;

    l1[1]=1;
    v[a[1]]=1;
    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));

    l2[1]=1;
    v[a[1]]=1;
    nr=1;
    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;
}