Cod sursa(job #336875)

Utilizator rumburakrumburak rumburak Data 1 august 2009 19:02:58
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<cstdio>
#include<vector>

using namespace std;

const unsigned int m = 699967;
const unsigned int N = (1<<20);

unsigned int* h[m],nr[m];
unsigned int ha[m],hb[m],haa[m],hbb[m];

unsigned int n,v[N];
int a,b;

void alocare()
{
	for(unsigned int i=0;i<m;++i)
	{
		h[i]=new unsigned int[1+nr[i]];
		h[i][0]=haa[i]=hbb[i]=0;
		ha[i]=hb[i]=1;
	}
}

void citire()
{
	char s[11],*p;
	scanf("%u%u%u\n",&n,&a,&b);
	for(unsigned int i=0;i<n;++i)
	{
		scanf("%s\n",s);
		for(p=s;*p;++p)
			v[i]=v[i]*10+*p-'0';
		++nr[v[i]%m];
	}
	alocare();
}

inline bool exista_a(unsigned int x)
{
	unsigned int r=x%m,i,n;
	for(i=ha[r],n=1+haa[r] ; i!=n ; ++i)
		if(h[r][i]==x)
			return true;
	return false;
}

inline bool exista_b(unsigned int x)
{
	unsigned int r=x%m,i,n;
	for(i=hb[r],n=1+hbb[r] ; i!=n ; ++i)
		if(h[r][i]==x)
			return true;
	return false;
}

inline void sterge_a(unsigned int x)
{
	++ha[x%m];
}

inline void sterge_b(unsigned int x)
{
	++hb[x%m];
}

inline void adauga_a(unsigned int x)
{
	++haa[x%m];
}

inline void adauga_b(unsigned int x)
{
	++hbb[x%m];
}
void calcul()
{
	long long reza=0,rezb=0;
	unsigned int i,r;
	int nra=0,nrb=0,pa=-1,pb=-1;
	for(i=0;i<n;++i)
	{
		r=v[i]%m;
		h[r][++h[r][0]]=v[i];
	}
	for(i=0;i<n;++i)
	{
		if(!exista_a(v[i]))
			++nra;
		adauga_a(v[i]);
		while(nra==a)
		{
			sterge_a(v[++pa]);
			if(!exista_a(v[pa]))
				--nra;
		}
		reza+=i-pa;
	}
	for(i=0;i<n;++i)
	{
		if(!exista_b(v[i]))
			++nrb;
		adauga_b(v[i]);
		while(nrb==b+1)
		{
			sterge_b(v[++pb]);
			if(!exista_b(v[pb]))
				--nrb;
		}
		rezb+=i-pb;
	}
	printf("%lld\n",rezb-reza);
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	citire();
	calcul();
	return 0;
}