Cod sursa(job #1457261)

Utilizator cojocarugabiReality cojocarugabi Data 3 iulie 2015 00:31:11
Problema Trapez Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
# include <bits/stdc++.h>
# define x first
# define y second
# define x0 x
# define y0 y.x
# define z0 y.y
# define ll long long
# define ld double
using namespace std;
ifstream fi("trapez.in");
ofstream fo("trapez.out");
const int nmax = 1e3 + 5;
pair < int , int > s[nmax];
map < pair < int , int > , int > v;
int gcd(int a,int b)
{
    return !b ? a:gcd(b,a%b);
}
int main(void)
{
    int n;
    fi>>n;
    for (int i = 1;i <= n;++i) fi>>s[i].x>>s[i].y;
    int sol1 = 0,cnt = 0;
    for (int i = 1;i <= n;++i)
        for (int j = i + 1;j <= n;++j) if (s[i].x == s[j].x) ++sol1;
    ll ans = 1ll * sol1 * (sol1 - 1) / 2ll;
    int sol2 = 0;
    for (int i = 1;i <= n;++i)
        for (int j = i + 1;j <= n;++j) if (s[i].y == s[j].y) ++sol2;
    ans += 1ll * sol2 * (sol2 - 1) / 2ll;
    for (int i = 1;i <= n;++i)
        for (int j = i + 1;j <= n;++j)
            if (s[i].x != s[j].x && s[i].y != s[j].y)
            {
                int a = s[i].y - s[j].y;
                int b = s[i].x - s[j].x;
                if (a < 0 && b < 0) a = -a,b = -b;
                if (a > 0 && b < 0) a = -a,b = -b;
                int p = 1;
                if (a < 0) p = -1,a = -a;
                int g = gcd(a,b);a /= g;b /= g;a *= p;
                ans += v[make_pair(a,b)];
                v[make_pair(a,b)]++;
            }
    return fo << ans << '\n',0;
}