Cod sursa(job #594773)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 9 iunie 2011 16:34:13
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.91 kb
#include <cstdio>
#include <vector>

using namespace std;

vector <unsigned int> hl[200003],hr[200003];
unsigned int v[1048577];

int main()
{
    unsigned int sol=0,n,l=1,r=1,cnt=0,p,q,a,i,j,ok,ind=0;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%u %u %u\n",&n,&p,&q);
 //part1
 //
    for (i=1;i<=n&&cnt<p;++i)
    {
        scanf("%u\n",&v[i]);
        a=v[i]%200003;
        for (j=0;j<hl[a].size();++j)
            if (hl[a][j]==v[i])
                break;
        if (j==hl[a].size())
            ++cnt;
        hl[a].push_back(v[i]);
        hr[a].push_back(v[i]);
    }
    a=v[1]%200003;
    while (v[r+1]==v[r]&&r<=i)
    {
        ++r;
        for (j=0;j<hr[a].size();++j)
            if (hr[a][j]==v[r])
            {
                hr[a][j]=hr[a][hr[a].size()-1];
                hr[a].pop_back();
                break;
            }
    }
    sol+=r;
//part2
//
    for (;i<=n&&cnt<q;++i)
    {
        scanf("%u\n",&v[i]);
        a=v[i]%200003;
        for (j=0;j<hr[a].size();++j)
            if (hr[a][j]==v[i])
                break;
        if (j==hr[a].size())
        {
            ++cnt;
            for (ok=1;ok;++r,ind=0)
            {
                ok=0;
                a=v[r]%200003;
                for (j=0;j<hr[a].size();++j)
                    if (hr[a][j]==v[r])
                    {
                        ++ok;
                        ind=j;
                    }
                hr[a][ind]=hr[a][hr[a].size()-1];
                hr[a].pop_back();
                --ok;
            }
            a=v[r]%200003;
            while (v[r+1]==v[r]&&r<=i)
            {
                ++r;
                for (j=0;j<hr[a].size();++j)
                    if (hr[a][j]==v[r])
                    {
                        hr[a][j]=hr[a][hr[a].size()-1];
                        hr[a].pop_back();
                        break;
                    }
            }
        }
        hl[v[i]%200003].push_back(v[i]);
        hr[v[i]%200003].push_back(v[i]);
        sol+=r;
    }
//part3a
//
    for (;i<=n;++i)
    {
        scanf("%u\n",&v[i]);
        a=v[i]%200003;
        for (j=0;j<hr[a].size();++j)
            if (hr[a][j]==v[i])
                break;
        if (j==hr[a].size())
        {
            ++cnt;
            for (ok=1;ok;++r,ind=0)
            {
                ok=0;
                a=v[r]%200003;
                for (j=0;j<hr[a].size();++j)
                    if (hr[a][j]==v[r]&&!ok)
                    {
                        ++ok;
                        ind=j;
                    }
                hr[a][ind]=hr[a][hr[a].size()-1];
                hr[a].pop_back();
                --ok;
                while (v[r+1]==v[r]&&r<=i)
                {
                    ++r;
                    for (j=0;j<hr[a].size();++j)
                        if (hr[a][j]==v[r])
                        {
                            hr[a][j]=hr[a][hr[a].size()-1];
                            hr[a].pop_back();
                            break;
                        }
                }
            }
        }
//part3b
//
        for (j=0;j<hl[a].size();++j)
            if (hl[a][j]==v[i])
                break;
        if (j==hl[a].size())
        {
            ++cnt;
            for (ok=1;ok;++l,ind=0)
            {
                ok=0;
                a=v[l]%200003;
                for (j=0;j<hl[a].size();++j)
                    if (hl[a][j]==v[l])
                    {
                        ++ok;
                        ind=j;
                    }
                hl[a][ind]=hl[a][hl[a].size()-1];
                hl[a].pop_back();
                --ok;
            }
        }
        hl[v[i]%200003].push_back(v[i]);
        hr[v[i]%200003].push_back(v[i]);
        sol+=r-l+1;
    }
//
    printf("%u\n",sol);
    return 0;
}