Cod sursa(job #652831)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 decembrie 2011 14:53:57
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#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;
}