Cod sursa(job #770603)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 23 iulie 2012 15:22:59
Problema Triang Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<complex>
using namespace std;
#define mod 11
#define A 0.6180339887
#define eps 0.001
struct punct {
	double x,y;
};
punct aa[1501];
vector <punct> v[mod];
inline void adauga(punct x)
{
	int k;
	double h;
	h=A*(x.x);
	h=(double)h-floor(h);
	k=abs(h*mod);
	v[k].push_back(x);
}
inline int egal(double x, double y)
{
	if(fabs(x-y)<=eps)
		return 1;
	return 0;
}
inline int cauta(punct x)
{
	int k,nr;
	double h;
	h=A*(x.x);
	h=(double)h-floor(h);
	k=abs(h*mod);
	nr=0;
	for(vector <punct> :: iterator it=v[k].begin();it!=v[k].end();it++) 
		if(egal(x.x,it->x) && egal(x.y,it->y))
			nr++;
	return nr;
}
int main ()
{
	int i,j,n,nr;
	complex <double> a,b,c,ep(-cos(M_PI/3),sin(M_PI/3));
	punct x;
	ifstream f("triang.in");
	ofstream g("triang.out");
	f>>n;
	for(i=1;i<=n;i++) {
		f>>aa[i].x>>aa[i].y;
		adauga(aa[i]);
	}
	f.close();
	nr=0;
	for(i=1;i<=n-1;i++)
		for(j=i+1;j<=n;j++) {
			a=complex <double> (aa[i].x,aa[i].y);
			b=complex <double> (aa[j].x,aa[j].y);
			c=-a*ep-b*ep*ep;
			x.x=real(c);
			x.y=imag(c);
			nr=nr+cauta(x);
			c=-b*ep-a*ep*ep;
			x.x=real(c);
			x.y=imag(c);
			nr=nr+cauta(x);
		}
	g<<nr/3;
	g.close();
	return 0;
}