Cod sursa(job #490855)

Utilizator ZethpixZethpix Zethpix Data 8 octombrie 2010 16:57:19
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>

struct list
{
	int x,y,s;
	list *link;
}*H[500002],*p;

int i,j,n,m,pow,nr,s,S,v[1027],x;

void addlink(int pos,int s,int x,int y)
{
	list *p;
	p=new list;
	p->s=s;
	p->x=x;
	p->y=y;
	p->link=H[pos];
	H[pos]=p;
}

void quicksort(int L,int R)
{
	int i=L,j=R,aux;
	int piv=v[(L+R)/2];
	while(i<=j)
	{
		while(piv<v[j]) j--;
		while(v[i]<piv) i++;
		if(i<=j)
		{
			aux=v[i];
			v[i]=v[j];
			v[j]=aux;
			i++;
			j--;
		}
	}
	if(L<j) quicksort(L,j);
	if(i<R) quicksort(i,R);
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);

	scanf("%d%d",&n,&S);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	quicksort(1,n);

	m=(n*n)/2;
	pow=1;
	while(pow<=m) pow*=2;
	m=(pow/2+pow)/2;
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			s=v[i]+v[j];
			x=s%m;
			addlink(x,s,i,j);
		}

	nr=0;
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			s=v[i]+v[j];
			if(s<=S)
			{
				x=(S-s)%m;
				p=H[x];
				while(p!=NULL)
				{
					if(p->s==S-s)
						if(p->x>i&&p->x>j&&p->y>i&&p->y>j) nr++;
					p=p->link;
				}
			}
			else break;
		}

	printf("%d\n",nr);
	return 0;
}