Cod sursa(job #524276)

Utilizator andunhillMacarescu Sebastian andunhill Data 20 ianuarie 2011 20:50:57
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
#define eps 0.1
ifstream f("triang.in");
ofstream g("triang.out");
class complex
{	double re,im;
	public:
		complex() { }
		complex(double a,double b) { re=a , im=b; }
		void set(double a,double b) { re=a , im=b; }
		complex operator +(complex a)
		{	complex c; c.re=a.re+re; c.im=a.im+im;
			return c;
		}
		complex operator -(complex a)
		{	complex c; c.re=re-a.re , c.im=im-a.im; return c; }
		complex operator *(complex a)
		{	complex c; c.re=re*a.re-im*a.im; c.im=re*a.im+im*a.re; return c; }
		complex operator /(int a)
		{	complex c; c.re=re/a , c.im=im/a; return c; }
		bool operator <(complex a)
		{	if(re-a.re<0) return 1;
			if(abs(re-a.re)<=eps && im-a.im<0) return 1;
			return 0;
		}
		bool operator >(complex a)
		{	if(re-a.re<0) return 0;
			if(abs(re-a.re)<=eps && im-a.im<0) return 0;
			return 1;
		}
		bool operator ==(complex a)
		{	if(abs(re-a.re)<=eps && abs(im-a.im)<=eps)
				return 1;
			return 0;
		}
};
bool cmp(complex a,complex b)
{	return a<b;
}
complex epsp(0.5,0.86);
complex epsn(0.5,-0.86);
int N;
complex af[1501];
bool search(complex x)
{	int left,right,mid;
	left=1 , right=N;
	while(left<=right)
	{	mid=(left+right)>>1;
		if(x<af[mid]) right=mid-1;
		if(x>af[mid]) left=mid+1;
		if(x==af[mid]) return 1;
	}
	return 0;
}
int main()
{	int i,j,nr=0; double x,y;
	f>>N;
	for(i=1;i<=N;i++)
	{	f>>x>>y;
		af[i].set(x,y);
	}
	sort(af+1,af+N+1,cmp);
	for(i=1;i<=N;i++)
		for(j=i+1;j<=N;j++)
		{	if(search(af[i]+epsp*(af[j]-af[i])))
				nr++;
			if(search(af[i]+epsn*(af[j]-af[i])))
				nr++;
		}
	g<<nr/3;
	f.close();
	g.close();
	return 0;
}