Cod sursa(job #1198408)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 iunie 2014 16:41:32
Problema Patrate 3 Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>

using namespace std;

const int Nmax = 1000 + 2;
const double EPS = 1e-5;

class Point
{
public:

    double x, y;

    Point( const double _x = 0, const double _y = 0 )
    {
        x = _x;
        y = _y;
    }

    bool operator < ( const Point &P ) const
    {
        if ( abs( x - P.x ) < EPS )
                return ( y < P.y );
        else
                return ( x < P.x );
    }
};

int N;
Point P[Nmax];
set <Point> US;

int main()
{
    ifstream in("patrate3.in");
    ofstream out("patrate3.out");

    in >> N;

    for ( int i = 1; i <= N; ++i )
    {
        in >> P[i].x >> P[i].y;

        US.insert( P[i] );
    }

    sort( P + 1, P + N + 1 );

    int sol = 0;

    for ( int i = 1; i < N; ++i )
    {
        for ( int j = i + 1; j <= N; ++j )
        {
            double mijx = ( P[i].x + P[j].x ) / 2.0;
            double mijy = ( P[i].y + P[j].y ) / 2.0;

            double dx = abs( mijx - P[i].x );
            double dy = abs( mijy - P[i].y );

            Point A, B;

            if ( P[i].y < P[j].y )
            {
                A.x = mijx + dy;
                A.y = mijy - dx;
                B.x = mijx - dy;
                B.y = mijy + dx;
            }
            else
            {
                A.x = mijx - dy;
                A.y = mijy - dx;
                B.x = mijx + dy;
                B.y = mijy + dx;
            }

            if ( US.find( A ) != US.end() && US.find( B ) != US.end() )
                    sol++;
        }
    }

    out << sol << "\n";

    return 0;
}