Cod sursa(job #336799)

Utilizator rumburakrumburak rumburak Data 1 august 2009 16:25:05
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<cstdio>
#include<vector>

using namespace std;

const unsigned int m = 200011;
const unsigned int N = (1<<20);
const int lim = (1<<4);

unsigned int ha[m][lim][2];
unsigned int hb[m][lim][2];

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

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

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

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

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

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

void calcul()
{
	long long rez=0;
	unsigned int i;
	int nra=0,nrb=0,pa=-1,pb=-1;
	for(i=0;i<n;++i)
	{
		if(!exista_a_ad(v[i]))
			++nra;
		if(!exista_b_ad(v[i]))
			++nrb;
		while(nra==a)
		{
			++pa;
			if(!exista_a_st(v[pa]))
				--nra;
		}
		while(nrb>b)
		{
			++pb;
			if(!exista_b_st(v[pb]))
				--nrb;
		}
		rez+=pa-pb;
	}
	printf("%lld\n",rez);
}

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