Cod sursa(job #245505)

Utilizator AndreyPAndrei Poenaru AndreyP Data 18 ianuarie 2009 11:11:37
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include<stdio.h>
#define M 666013
struct list
{
	unsigned int x;
	int cnt;
	list *next;
};
list *a[M],*b[M];
int v[1049000];
int unde,k1,k2;
unsigned int x;
int n,l,u;
long long rez1,rez2;
void add(list *a[M],int &k)
{
	++k;
	list *aux=new list;
	aux->x=x;
	aux->cnt=1;
	aux->next=a[unde];
	a[unde]=aux;
}
list* find(list *a[M],int &k)
{
	for(list *y=a[unde]; y->next!=NULL; y=y->next)
	{
		if(y->next->x==x)
			return y;
	}
	return NULL;
}
inline void insert(list *a[M],int &k)
{
	unde=x%M;
	if(a[unde]==NULL)
	{
		add(a,k);
		return;
	}
	if(a[unde]->x==x)
	{
		++(a[unde]->cnt);
		return;
	}
	list *aux=find(a,k);
	if(aux==NULL)
		return;
	++(aux->next->cnt);
}
inline void sterge(list *a[M],int &k)
{
	unde=x%M;
	if(a[unde]==NULL)
		return;
	if(a[unde]->x==x)
	{
		int &aux=a[unde]->cnt;
		--aux;
		if(aux)
			return;
		else
		{
			--k;
			list *aux1=a[unde];
			a[unde]=a[unde]->next;
			delete aux1;
		}
		return;
	}
	list *aux=find(a,k);
	if(aux==NULL)
		return;
	--k;
	int ref=aux->next->cnt;
	--ref;
	if(ref)
		return;
	list *aux1=aux->next;
	aux->next=aux->next->next;
	delete aux1;
}
int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	scanf("%d%d%d",&n,&l,&u);
	++u;
	int fs1=1,fs2=1;
	for(int i=1; i<=n; ++i)
		scanf("%u",&v[i]);
	int poz=1;
	x=v[1];
	insert(a,k1);
	bool ok;
	int aux;
	long long aux1;
	for(int i=1; i<=n; ++i)
	{
		ok=true;
		while(k1<l)
		{
			++poz;
			if(poz>n)
			{
				poz=n;
				ok=false;
				break;
			}
			x=v[poz];
			insert(a,k1);
		}
		if(ok)
		{
			x=v[poz--];
			sterge(a,k1);
		}
		aux=poz-i+1;
		aux1=(long long)aux;
		rez1+=aux1;
		x=v[i];
		sterge(a,k1);
	}
	poz=1;
	x=v[1];
	insert(b,k2);
	for(int i=1; i<=n; ++i)
	{
		ok=true;
		while(k2<u)
		{
			++poz;
			if(poz>n)
			{
				poz=n;
				ok=false;
				break;
			}
			x=v[poz];
			insert(b,k2);
		}
		if(ok)
		{
			x=v[poz--];
			sterge(b,k2);
		}
		aux=poz-i+1;
		aux1=(long long)aux;
		rez2+=aux1;
		x=v[i];
		sterge(b,k2);
	}
	printf("%lld\n",rez2-rez1);
	//v[++v[0]]=n+1;
	//int aux;
	//long long aux1;
	/*int i=1,j1=l,j2=u+1;
	for(; j2<=v[0]; ++i,++j1,++j2)
	{
		aux=(v[j2]-v[j1])*(v[i+1]-v[i]);
		aux1=(long long)aux;
		rez+=aux1;
	}
	for(; j1<v[0]; ++i,++j1)
	{
		aux=(v[v[0]]-v[j1])*(v[i+1]-v[i]);
		aux1=(long long)aux;
		rez+=aux;
	}*/
	/*int poz=1,poz1=l,poz2=u+1;
	for(int i=1; i<=n && poz1<v[0]; ++i)
	{
		if(i>=v[poz+1])
		{
			++poz;
			++poz1;
			++poz2;
		}
		if(poz2>v[0])
			poz2=v[0];
		aux=v[poz2]-v[poz1];
		aux1=(long long)aux;
		rez+=aux1;
	}*/
	//printf("%lld\n",rez2-rez1);
	return 0;
}