Cod sursa(job #1360947)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 25 februarie 2015 18:54:45
Problema Trapez Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>

#define f first
#define s second
#define mp make_pair

using namespace std;

int a[1024], b[1024];
pair <int, int> v[1000010];

bool cmp (pair <int, int> a, pair <int, int> b)
{
    long long x = 1LL * a.f * b.s;
    long long y = 1LL * b.f * a.s;
    return (1LL * x < 1LL * y);
}

int main ()
{
    freopen ("trapez.in", "r", stdin);
    freopen ("trapez.out", "w", stdout);

    int n;
    scanf ("%d", &n);

    for (int i = 1; i <= n; ++i)
        scanf ("%d %d", &a[i], &b[i]);

    int k = 0;
    for (int i = 1; i < n; ++i)
        for (int j = i + 1; j <= n; ++j)
            if (a[i] - a[j]) v[++k] = mp (b[i] - b[j], a[i] - a[j]);

    sort (v + 1, v + k + 1, cmp);

    //for (int i = 1; i <= k; ++i)
      //  printf ("%lf\n", 1.0 * v[i].f / v[i].s);

    int nr = 0;
    for (int i = 2; i <= k;)
    {
        int nrr = 1;
        long long x = 1LL * v[i - 1].f * v[i].s;
        long long y = 1LL * v[i].f * v[i - 1].s;


        while (1LL * x == 1LL * y && i <= k)
        {
            ++nr;
            ++i;

            x = 1LL * v[i - 1].f * v[i].s;
            y = 1LL * v[i].f * v[i - 1].s;
        }

        nr += nrr * (nrr - 1) / 2;
        if (nrr == 1) ++i;

    }

    printf ("%d\n", nr);

    return 0;
}