Cod sursa(job #652750)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 decembrie 2011 10:19:29
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="secv5.in";
const char OutFile[]="secv5.out";
const int MaxN=1<<20;
const int HASH_MOD=350377;

ifstream fin(InFile);
ofstream fout(OutFile);

struct HashElement
{
	HashElement(int value=0, int count=0):value(value),count(count){}
	int value;
	int count;
};

unsigned int N,L,U,st,dif,v[MaxN];
long long sol;
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;
		}
	}
}

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

	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;
}