Cod sursa(job #594971)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 10 iunie 2011 17:58:05
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
#include <vector>

using namespace std;

struct str
{
    unsigned int val;
    int ind;
};

vector <str> h[200003];
int v[1048577],vl[1048577],vr[1048577];

int main()
{
    int i,n,p,q,cnt=0,l=1,r=1,a,sol=0;
    unsigned int j,x;
    str aux;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%u %u %u\n",&n,&p,&q);
    for (i=1;i<=n;++i)
    {
        scanf("%u\n",&x);
        a=x%200003;
        for (j=0;j<h[a].size();++j)
            if (h[a][j].val==x)
                break;
        if (j==h[a].size())
        {
            ++cnt;
            aux.ind=cnt;
            aux.val=x;
            h[a].push_back(aux);
            v[i]=cnt;
        }
        else
            v[i]=h[a][j].ind;
    }
    cnt=0;
    for (i=1;i<=n&&cnt<p;++i)
    {
        ++vl[v[i]];
        ++vr[v[i]];
        if (vl[v[i]]==1)
            ++cnt;
    }
    while (vr[v[r]]>1)
    {
        --vr[v[r]];
        ++r;
    }
    if (cnt==p)
        sol+=r;
    for (;i<=n&&cnt<q;++i)
    {
        ++vl[v[i]];
        ++vr[v[i]];
        if (vr[v[i]]==1)
        {
            if (vl[v[i]]==1)
                ++cnt;
            while (vr[v[r]]>1)
            {
                --vr[v[r]];
                ++r;
            }
            --vr[v[r]];
            ++r;
        }
        while (vr[v[r]]>1)
        {
            --vr[v[r]];
            ++r;
        }
        sol+=r;
    }
    for (;i<=n;++i)
    {
        ++vl[v[i]];
        ++vr[v[i]];
        if (vr[v[i]]==1)
        {
            while (vr[v[r]]>1)
            {
                --vr[v[r]];
                ++r;
            }
            --vr[v[r]];
            ++r;
            if (vl[v[i]]==1)
            {
                while (vl[v[l]]>1)
                {
                    --vl[v[l]];
                    ++l;
                }
                --vl[v[l]];
                ++l;
            }
        }
        while (vr[v[r]]>1)
        {
            --vr[v[r]];
            ++r;
        }
        sol+=r-l+1;
    }
    printf("%d",sol);
    return 0;
}