Cod sursa(job #327968)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 30 iunie 2009 17:20:01
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define FIN "trapez.in"
#define FOUT "trapez.out"

#define N 1002
#define M 1000005

int n, r, m;

pair <int, int> v[N], d[M];

void read()
{
    int i;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &n);

    for (i = 1; i <= n; ++ i)
        scanf("%d%d", &v[i].first, &v[i].second);
}

int comp(pair <int,int>  a, pair <int, int> b)
{
    if (!a.second || !b.second)
        return !b.second && !a.second;
    if (!a.first || !b.first)
        return !b.first && !a.first;

    return (a.first * b.second) > (b.first * a.second);
}

int match(pair <int, int> a, pair <int, int> b)
{
    return (a.first * b.second == a.second * b.first);
}

void solve()
{
    int i, j, x = 0;

    for (i = 1; i <= n; ++ i)
        for (j = 1; j <= n; ++ j)
            if (i != j)
                d[++m] = make_pair(v[i].first - v[j].first, v[i].second - v[j].second);

    sort(d + 1, d + m + 1, comp);

    for (i = 1; i < m; ++ i)
        if (match(d[i], d[i + 1]))
            if (match(d[i], d[i - 1]))
                ++ x;
            else
            {
                r += x * (x - 1) / 2;
                x = 2;
            }

    r += x * (x - 1) / 2;
}

int main()
{
    read();

    solve();

    printf("%d\n", r);
}