Cod sursa(job #346458)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 7 septembrie 2009 21:24:10
Problema Trapez Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 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.first || !a.second)
        if (!b.first || !b.second)
            return 1;
        else
            return b.first / b.second;

    if (!b.first || !b.second)
        return a.first / a.second;
*/
    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 = i + 1; j <= n; ++ 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 ((i - 1) && 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);
}