Cod sursa(job #69704)

Utilizator BloodRainBurceanu Gabriel BloodRain Data 3 iulie 2007 23:04:18
Problema Numarare triunghiuri Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
//varianta de 75 puncte
#include<fstream.h>

int n,i,j,v[801];
int outOfBorders,mijBun,stanga,dreapta;
int merge(int a,int b, int c)
	{
	if(a+b<c) return -1;//tre sa caut la stanga
	if(a+c<b||c+b<a) return -2; // tre sa caut la dreapta
	return 1;
	}
int cauta(int directie,int stang)
	{
	int st,dr,mij;
	st=j+1;
	if(directie==1) st=stang;
	dr=n;
	while(st<=dr)
		{
		mij=(st+dr)/2;
		outOfBorders=((mij+directie>n)||(mij+directie<1));
		mijBun=merge(v[i],v[j],v[mij]);
		if(mijBun==1)
		       {
		       if(outOfBorders)
					return mij;
		       if(merge(v[i],v[j],v[mij+directie])!=1||mij+directie<=j)
					return mij;
		       if(directie==1) st=mij+1;
		       else dr=mij-1;
		       }
		//else if(outOfBorders) return -1;
		else if(mijBun==-1) dr=mij-1;
		else st=mij+1;//if(mijBun==-2)
		}
	return -1;
	}

int main()
{
ofstream out("nrtri.out");
int cnt=0;
ifstream in("nrtri.in");
in>>n;
for(i=1;i<=n;i++)
	in>>v[i];
in.close();
int aux;
for(i=1;i<n;i++)
	for(j=i+1;j<=n;j++)
		if(v[i]>v[j])
			{
			aux=v[i];
			v[i]=v[j];
			v[j]=aux;
			}
for(i=1;i<n;i++)
	for(j=i+1;j<=n;j++)
		{
		stanga=cauta(-1,0);
		if(stanga!=-1)  //sau dreapta ca tot aia e(adica nu a gasit nici un numar care sa mearga)
			{
			dreapta=cauta(1,stanga);
			cnt+=dreapta-stanga+1;
			}
		}

out<<cnt<<'\n';
out.close();
return 0;
}