Cod sursa(job #829031)

Utilizator ChallengeMurtaza Alexandru Challenge Data 4 decembrie 2012 20:03:47
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include <vector>
 
using namespace std;
 
const char InFile[]="secv5.in";
const char OutFile[]="secv5.out";
const unsigned int MaxN=1<<20;
const unsigned int HASH_MOD=9319;
 
ifstream fin(InFile);
ofstream fout(OutFile);
 
struct HashElement
{
    HashElement(unsigned int value=0, unsigned int count=0):value(value),count(count){}
    unsigned int value;
    unsigned int count;
};
 
unsigned int N,L,U,st,dif,v[MaxN],key[MaxN];
long long sol;
char *ptr,buffer[11534469];
vector<HashElement> H[HASH_MOD];
 
inline void AddHash(const unsigned int &value, const unsigned int &key)
{
    for(vector<HashElement>::iterator it=H[key].begin();it!=H[key].end();++it)
    {
        if(it->value==value)
        {
            ++it->count;
            return;
        }
    }
    H[key].push_back(HashElement(value,1));
    ++dif;
}
 
inline void DeleteHash(const unsigned int &value, const unsigned int &key)
{
    for(vector<HashElement>::iterator it=H[key].begin();it!=H[key].end();++it)
    {
        if(it->value==value)
        {
            --it->count;
            if(it->count==0)
            {
                *it=H[key][H[key].size()-1];
                H[key].pop_back();
                --dif;
            }
            return;
        }
    }
}
 
inline unsigned int Number()
{
    while(!('0'<=*ptr && *ptr<='9'))
    {
        ++ptr;
    }
 
    unsigned int sol=0;
    while('0'<=*ptr && *ptr<='9')
    {
        sol*=10;
        sol+=*ptr-'0';
        ++ptr;
    }
    return sol;
}
 
int main()
{
    streambuf *pbuf=fin.rdbuf();
    fin.seekg(0, ios::end);
    unsigned int BUFFERSIZE=(int)(fin.tellg());
    ptr=buffer;
    fin.seekg(0, ios::beg);
    pbuf->sgetn(buffer,BUFFERSIZE);
    fin.close();
 
    N=Number();
    L=Number();
    U=Number();
    for(register unsigned int i=0;i<N;++i)
    {
        v[i]=Number();
        key[i]=v[i]%HASH_MOD;
        AddHash(v[i],key[i]);
        while(dif>U)
        {
            DeleteHash(v[st],key[st]);
            ++st;
        }
        sol+=i-st+1;
    }
 
    while(st<N)
    {
        DeleteHash(v[st],key[st]);
        ++st;
    }
 
    dif=0;
    st=0;
    --L;
    for(register unsigned int i=0;i<N;++i)
    {
        AddHash(v[i],key[i]);
        while(dif>L)
        {
            DeleteHash(v[st],key[st]);
            ++st;
        }
        sol-=i-st+1;
    }
 
    fout<<sol;
    fout.close();
    return 0;
}