Cod sursa(job #1966223)

Utilizator workwork work work Data 15 aprilie 2017 00:02:12
Problema Triang Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <algorithm>
#define sinus 0.8660254
#define cosinus 0.5

using namespace std;


ifstream F("triang.in");
ofstream G("triang.out");

int n, st, dr, mij, sol;
double a, b;
pair <double, double > v[1502];

int egal(double x, double y)
{
    double dif = x - y;
    if(dif >= -0.001 && dif <= 0.001)
        return 1;
    return 0;
}

int main()
{
    F >> n;
    for(int i = 1; i<= n; ++ i)
        F >> v[i].first >> v[i].second;
    sort(v + 1, v + n + 1);
    for(int i = 1; i < n - 1; ++ i)
        for(int j = i + 1; j < n; ++ j)
        {
            a = v[i].first + (v[j].first - v[i].first)*cosinus - (v[j].second - v[i].second)*sinus;
            b = v[i].second + (v[j].second - v[i].second)*cosinus + (v[j].first - v[i].first)*sinus;

            st = j + 1;
            dr = n;
            while(st <= dr)
            {
                mij = (st + dr) >> 1;
                if(egal(v[mij].first, a) && egal(v[mij].second, b))
                    {sol ++;break;}
                if(a < v[mij].first || (egal(v[mij].first, a) && b < v[mij].second))
                    dr = mij - 1;
                else
                    st = mij + 1;
            }

            a = v[i].first + (v[j].first - v[i].first)*cosinus + (v[j].second - v[i].second)*sinus;
            b = v[i].second + (v[j].second - v[i].second)*cosinus - (v[j].first - v[i].first)*sinus;

            st = j + 1;
            dr = n;
            while(st <= dr)
            {
                mij = (st + dr) >> 1;
                if(egal(v[mij].first, a) && egal(v[mij].second, b))
                    {sol ++;break;}
                if(a < v[mij].first || (egal(v[mij].first, a) && b < v[mij].second))
                    dr = mij - 1;
                else
                    st = mij + 1;
            }
        }
    G << sol;
    return 0;
}