Cod sursa(job #262132)

Utilizator catalin93Catalin Ionescu catalin93 Data 19 februarie 2009 00:30:22
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5000
int a[N],n,x;
char s[N];

int caut(int x,int n,int a[N])
{
	int st=0, dr = n-1, m;
	while(st != dr)
	{
		m = (dr - st) / 2 + st;
		if( x  <= a[m])
			dr = m;
		else
			st = m+1;
	}
	if(x == a[m])
		return st;
	return -1;
}

/*
void sortare()
{
	int i,sort,aux;
	sort = 0;
	while(sort==0)
	{
		sort = 1;
		for(i=1;i<=n-1;i++)
		
			if(a[i] > a[i+1])
			{
				aux = a[i];
				a[i] = a[i+1];
				a[i+1] = aux;
				sort = 0;
			}
	}
	
}
*/
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main()
{
	int i,j,k,nr,m;
	
	freopen("nrtri.in","r",stdin);
	freopen("nrtri.out","w",stdout);
	
	scanf("%d\n",&n);
	/*
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	*/
	fgets(s,N,stdin);
	k=-1;x=0;
    for (i=0;s[i]!=NULL;i++)
        if (s[i]==' ') a[++k]=x,x=0;
            else x=x*10+s[i]-'0';
	a[++k]=x;
	//sortare();
	qsort (a, n+1, sizeof(a[1]), compare);
	nr = 0;
	for(i=1;i<n;i++)
		for(j=i+1;j<=n;j++)
		{
			
			j += i;
			//for(k=n;a[k]>a[i]+a[j];k--);
			if(caut(j,n,a[N]) != -1)
				{
					j -= i;
					nr+=caut(j,n,a[N])  -j;
			}
			/*
			
			if(a[i] + a[j] >= a[k])
			{
				s += n - k  ;
				break;
			}
			*/
		}
	/*for(i=1;i<=n;i++)
		printf("%d\n",a[i]);*/
	printf("%d",nr);
	return 0;
}