Cod sursa(job #1488081)

Utilizator akaprosAna Kapros akapros Data 17 septembrie 2015 21:35:18
Problema Triang Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
#define maxN 1502
#define e 0.001
#define cosA 0.5000
#define sinA 0.8660254
using namespace std;
struct point
{
    double x,y;
} v[maxN];
int i, n, j;
long long sol;
int cmp(const point a, const point b)
{
    if (a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
int bs (int left, int right, double c, double d)
{
    int mid = (left + right) / 2;
    if(left > right)
        return 0;
    if(fabs(c - v[mid].x) < e && fabs(d - v[mid].y) < e)
        return 1;
    if (v[mid].x < c)
        return bs(mid + 1, right, c, d);
    return bs(left, mid - 1, c, d);
}
int main()
{
    point p;
    freopen("triang.in","r",stdin);
    freopen("triang.out","w",stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++ i)
        scanf("%lf %lf", &v[i].x, &v[i].y);
    sort(v + 1,v + n + 1, cmp);

    for (i = 1; i < n - 1; ++ i)
        for (j = i + 1; j < n; ++ j)
        {
            p.x = (v[i].x + v[j].x) * cosA + (v[i].y - v[j].y) * sinA;
            p.y = (v[j].x - v[i].x) * sinA + (v[i].y + v[j].y) * cosA;
            sol += bs(j + 1, n, p.x, p.y);

            p.x = (v[i].x + v[j].x) * cosA + (v[j].y - v[i].y) * sinA;
            p.y = (v[i].x - v[j].x) * sinA + (v[i].y + v[j].y) * cosA;
            sol += bs(j + 1, n, p.x, p.y);
        }
    printf("%lld",sol);
    return 0;
}