Cod sursa(job #1457263)

Utilizator cojocarugabiReality cojocarugabi Data 3 iulie 2015 00:35:37
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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;
const int pmax = 1e6 + 5;
pair < int , int > s[nmax];
pair < int , int > v[pmax];
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 sol = 0,N = 0;
    for (int i = 1;i <= n;++i)
        for (int j = i + 1;j <= n;++j) if (s[i].x == s[j].x) ++sol;
    ll ans = 1ll * sol * (sol - 1) / 2ll;
    sol = 0;
    for (int i = 1;i <= n;++i)
        for (int j = i + 1;j <= n;++j) if (s[i].y == s[j].y) ++sol;
    ans += 1ll * sol * (sol - 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 > 0 && b < 0)) a *= -1,b *= -1;
                int g = gcd(abs(a),abs(b));
                a /= g;b /= g;
                v[++N].x = a;v[N].y = b;
            }
    sort(v+1,v+1+N);
    for (int i = 1,j;i <= N;)
    {
        j = i;
        while (v[i] == v[j]) ++j;
        ans += 1ll * (j - i) * (j - i - 1) / 2;
        i = j;
    }
    return fo << ans << '\n',0;
}