Cod sursa(job #504874)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 29 noiembrie 2010 11:39:23
Problema Trapez Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<fstream>
#include<algorithm>
#define NMAX 1004

using namespace std;

ifstream f("trapez.in");
ofstream g("trapez.out");

struct panta{int a, b;} p[NMAX*NMAX];
struct punct{int x, y;} a[NMAX];

int n, m;
long long pos;

void pante()
{
	int A, B, nv=0, no=0, aa, bb;
	for (A=1; A<n; ++A)
		for (B=A+1; B<=n; ++B)
		{
			aa=a[A].y-a[B].y;
			bb=a[A].x-a[B].x;
			if (aa==0) ++no;
			else if (bb==0) ++nv;
			else 
			{
				p[++m].a=abs(aa);
				p[m].b=abs(bb);
				if (aa*bb<0) p[m].a*=-1;
			}
		}
	if (no>1) pos+=no*(no-1)/2;
	if (nv>1) pos+=nv*(nv-1)/2;
}

inline int cmp(panta w, panta q)
{
	return q.b*w.a<q.a*w.b;
}
	
void citeste()
{
	int i;
	f>>n;
	for (i=1; i<=n; ++i) f>>a[i].x>>a[i].y;
	pante();
}

void cauta()
{
	int i;
	long long nr=1;
	for (i=2; i<=m; ++i)
		if (p[i-1].a*p[i].b==p[i-1].b*p[i].a) ++nr;
		else 
		{
			if (nr>1) pos+=nr*(nr-1)/2;
			nr=1;
		}
	if (nr>1) pos+=nr*(nr-1)/2;
}

int main()
{
	citeste();
	sort(p+1, p+m+1, cmp);
	cauta();
	g<<pos<<"\n";
	f.close();
	g.close();
	return 0;
}