Cod sursa(job #652765)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 decembrie 2011 11:10:37
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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=350377;

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];
long long sol;
char *ptr,buffer[11534469];
vector<HashElement> H[HASH_MOD];

inline void AddHash(unsigned int value)
{
	unsigned int key=value%HASH_MOD;
	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(unsigned int value)
{
	unsigned int key=value%HASH_MOD;
	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();
		AddHash(v[i]);
		while(dif>U)
		{
			DeleteHash(v[st]);
			++st;
		}
		sol+=i-st+1;
	}

	while(st<N)
	{
		DeleteHash(v[st]);
		++st;
	}

	dif=0;
	st=0;
	--L;
	for(register unsigned int i=0;i<N;++i)
	{
		AddHash(v[i]);
		while(dif>L)
		{
			DeleteHash(v[st]);
			++st;
		}
		sol-=i-st+1;
	}

	fout<<sol;
	fout.close();
	return 0;
}