Mai intai trebuie sa te autentifici.

Cod sursa(job #922920)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 22 martie 2013 18:27:33
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <cstring>

#define DN 1048600
#define KEY 33013
#define un unsigned
#define val first
#define normal second

using namespace std;

vector< pair<un int,int> > hash[KEY];
un int v[DN],ind;
int n,l,u,apu[DN],apl[DN];
unsigned long long nrl=0,nru=0;

int insert(un int x)
{
    int nivel=x%KEY;
    for(un int i=0;i<hash[nivel].size();++i)
        if(hash[nivel][i].val==x)
            return hash[nivel][i].normal;

    hash[nivel].push_back(make_pair(x,++ind));
    return ind;
}

int main()
{
    int distl=0,distu=0,stl=1,stu=1;
    ifstream f("secv5.in");
    ofstream g("secv5.out");
    f>>n>>l>>u;
    --l;
    for(int i=1;i<=n;++i)
    {
        unsigned int x;
        f>>x;
        v[i]=insert(x);
    }

    for(int i=1;i<=n;++i)
    {

        if(distu<u || apu[v[i]])
        {
            ++apu[ v[i] ];
            if(apu[ v[i] ]==1)
                ++distu;
            nru+=(i-stu+1);
        }
        else
         {
                while(distu==u)
                {
                    --apu[ v[stu] ];
                    if(apu[ v[stu] ]==0)
                        --distu;
                    ++stu;
                }
                ++apu[ v[i] ];
                if(apu[v[i]]==1)
                    ++distu;
                nru+=(i-stu+1);
            }

        if(distl<l || apl[v[i]])
        {
            ++apl[ v[i] ];
            if(apl[ v[i] ]==1)
                ++distl;
            nrl+=(i-stl+1);
        }
        else
            {
                while(distl==l && stl<=i)
                {
                    --apl[ v[stl] ];
                    if(apl[ v[stl] ]==0)
                        --distl;
                    ++stl;
                }

                ++apl[ v[i] ];
                ++distl;

                nrl+=(i-stl+1);

            }
    }
    if(l==0)
        nrl=0;
    g<<nru-nrl;

    return 0;
}