Cod sursa(job #271345)

Utilizator moonbeamElma Moonbeam moonbeam Data 5 martie 2009 10:18:49
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>
#include<stdlib.h>
#define N 802
struct milk{int a;} v[N];
int n,ap[30001];
int compar(const void*p, const void*q)
{
	milk pp=*(milk*)p,qq=*(milk*)q;
	if (pp.a>qq.a) return 1;
	if (pp.a<qq.a) return -1;
	return 0;
}
int caut2(int p,int x,int u)   
{   
    int m;   
	while(p!=u)//cat timp intervalul in care caut are mai mult de un element   
    {   
        m=(p+u)/2;   
        if(x<=v[m].a)   
            u=m;   
        else  
            p=m+1;   
    }   
    if(v[p].a<x)   
        return p-1;   
    return p;   
}   

int caut1(int p,int x,int u)   
{   
    int m;   
    while(p!=u)//cat timp intervalul in care caut are mai mult de un element   
    {   
        m=(p+u)/2;   
        if(x<=v[m].a)   
            u=m;   
        else  
            p=m+1;   
    }   
    if(v[p].a>x)   
        return p-1;   
    return p;   
}   

int sum;
void tri(int x, int y,int n, int pozi)
{
	int p=ap[v[x].a]*ap[v[y].a],s=0;
	for (int i=pozi; i<=n; ++i) s=s+ap[v[i].a];
	sum+=p*s;
}
void suma(int n)
{
	int s;
	for (int i=1; i<n; ++i)
	{
		for (int j=i+1; j<=n; ++j)
		{
			s=v[i].a+v[j].a;
			if (s<=v[n].a)
			{
				int pozi=caut1(j+1,s,n);
				int pozf=caut2(j+1,s,n);
				if (v[pozf].a>s)
					--pozf;
				if (pozi==j) ++pozi;
				tri(i,j,pozf,pozi);
			}
			else 
				break;
		}
	}
	printf("%d",sum);
}
void citire()
{
	freopen("nrtri.in","r",stdin);
	freopen("nrtri.out","w",stdout);
	scanf("%d",&n);
	int num=1;
	for (int i=1; i<=n; ++i)
	{
		scanf("%d",&v[num].a);
		++ap[v[num].a];
		if (ap[v[num].a]==1)
			++num;
	}
	if (ap[v[num].a]>1||v[num].a==0) --num;
	qsort(v+1,num,sizeof(v[0]),compar);
	for (int i=1; i<=num;++i) printf("%d ",v[i].a);
	suma(num);
}
int main()
{
	citire();
	return 0;
}