Pagini recente » Cod sursa (job #691386) | Cod sursa (job #1386455) | Cod sursa (job #407747) | Cod sursa (job #429643) | Cod sursa (job #652831)
Cod sursa(job #652831)
#include <fstream>
using namespace std;
const char InFile[]="secv5.in";
const char OutFile[]="secv5.out";
const unsigned int MaxN=1<<20;
const unsigned int HASH_MOD=3307;
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],count[MaxN],size[MaxN];
long long sol;
char *ptr,buffer[11534469];
HashElement *H[HASH_MOD];
inline void AddHash(const unsigned int &value, const unsigned int &key)
{
for(register unsigned int i=0;i<size[key];++i)
{
if(H[key][i].value==value)
{
++H[key][i].count;
return;
}
}
H[key][size[key]++]=HashElement(value,1);
++dif;
}
inline void DeleteHash(const unsigned int &value, const unsigned int &key)
{
for(register unsigned int i=0;i<size[key];++i)
{
if(H[key][i].value==value)
{
--H[key][i].count;
if(H[key][i].count==0)
{
H[key][i]=H[key][size[key]-1];
--size[key];
--dif;
}
return;
}
}
}
inline unsigned int Number()
{
if(*ptr==0)
{
return 0;
}
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;
++count[key[i]];
}
for(register unsigned int i=0;i<HASH_MOD;++i)
{
H[i]=new HashElement[count[i]];
}
for(register unsigned int i=0;i<N;++i)
{
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;
}