Cod sursa(job #732053)

Utilizator robertpoeRobert Poenaru robertpoe Data 9 aprilie 2012 16:54:01
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#define dim 1000010
using namespace std;
ifstream f("trapez.in");
ofstream g("trapez.out");
struct panta
{
	int abscisa,ordonata;
};
panta a[dim], p[1005];
int i,j,n,m,cmmdc,nr,x,y,r,rez;
inline int select(int fx, int fy)
{
	if (fy==0) 
		return fx;
	else 
		return select(fy, fx%fy);
}
inline bool comp (panta fx, panta fy)
{
	return fx.abscisa<fy.abscisa || (fx.abscisa==fy.abscisa && fx.ordonata<fy.ordonata);
}
inline void citeste_rezolva()
{
	f>>n; 
	for (i=1; i<=n; i++) 
		f>>p[i].abscisa>>p[i].ordonata;
	for (i=1; i<=n; i++)
		for (j=i+1; j<=n; j++) 
		{
			if (p[i].abscisa==p[j].abscisa)
			{
				a[++nr].abscisa=2;
				a[nr].ordonata=2;
			}
			else
			{
				x=p[i].abscisa-p[j].abscisa;
				y=p[i].ordonata-p[j].ordonata;
				if (x<0) 
				{ 
					x*=-1;
					y*=-1;
				}
			cmmdc=select(abs(x), abs(y));
			a[++nr].abscisa=x/cmmdc;
			a[nr].ordonata=y/cmmdc;
		}
	}
}
inline void finish()
{
	citeste_rezolva();
	sort (a+1, a+nr+1, comp);
	for (i=1; i<=nr; i++)
	{
		r=0;
		while (a[i].abscisa==a[i+1].abscisa && a[i].ordonata==a[i+1].ordonata) 
		{
			i++;
			r++;
		}
		rez=rez+(r*(r+1))/2;
	}
	g<<rez;
}
int main()
{
	finish();
	return 0;
}