Cod sursa(job #1774417)

Utilizator ArkinyStoica Alex Arkiny Data 8 octombrie 2016 22:12:32
Problema Trapez Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream>
#include<math.h>
#include<map>
using namespace std;

ifstream in("trapez.in");

ofstream out("trapez.out");


map<pair<long long, long long>, long long> mp;

typedef pair<long long, long long> POINT2D;

POINT2D points[1010];

int N;

long long Abs(long long x)
{
	return (x > 0) ? x : -x;
}

long long cmmdc(long long a, long long b)
{
	while (b)
	{
		long long r = a%b;
		a = b;
		b = r;
	}
	return a;
}

int main()
{

	in >> N;

	for (int i = 1;i <= N;++i)
		in >> points[i].first >> points[i].second;

	for (int i = 1;i <= N;++i)
	{
		for (int j = i+1;j <= N;++j)
		{
			if (points[i].first - points[j].first == 0)
				mp[make_pair(1LL << 63, 1LL << 63)]++;
			else if (points[i].second - points[j].second == 0)
				mp[make_pair(0, 0)]++;
			else
			{
				long long v_y = points[i].second - points[j].second, v_x = points[i].first - points[j].first;
				long long cm = cmmdc(Abs(v_y), Abs(v_x));
				if (v_y < 0 && v_x < 0)
					v_x *= -1, v_y *= -1;
				else if (v_x < 0 || v_y < 0)
				{
					if (v_x < 0)
						v_y *= -1,v_x*=-1;
				}
				mp[make_pair(v_y / cm, v_x / cm)]++;
			}
		}
	}
	long long rez = 0;
	for (auto i = mp.begin();i != mp.end();++i)
	{
		rez += (*i).second*((*i).second - 1) / 2;
	}
	
	out << rez;

	return 0;
}