Cod sursa(job #1308607)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 4 ianuarie 2015 14:33:49
Problema Patrate 3 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#define pii pair<int, int>
#define mp make_pair
#define pb push_back

using namespace std;

const int NMax = 1024;
const int MOD = 666013;
int N;
pii a[NMax];
vector <pii> H[MOD];
int ans;

inline void Insert(const int x, const int y)
{
    int cod = abs(x+y) % MOD;
    H[cod].pb(mp(x, y));
}

inline bool Search(const int x, const int y)
{
    int cod = abs(x+y) % MOD;
    for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
        if (it -> first == x && it -> second == y)
            return true;
    return false;
}

void GetNumber(int & x, char * s)
{
    int semn = 1;
    int i = 1;
    if (s[i] == '-')
    {
        semn = -1;
        ++ i;
    }
    x = 0;
    for(; s[i]; ++ i)
        if ('0' <= s[i] && s[i] <= '9')
            x = x * 10 + s[i] - '0';
    x = x * semn;
}

int main()
{
    freopen ("patrate3.in", "r", stdin);
    scanf ("%d", &N);
    char ch[30];
    for (int i = 1; i <= N; ++ i)
    {
        scanf ("%s", (ch+1));
        GetNumber(a[i].first, ch);
        scanf ("%s", (ch+1));
        GetNumber(a[i].second, ch);
        Insert(a[i].first, a[i].second);
    }

    for (int i = 1; i <= N; ++ i)
        for (int j = i + 1; j <= N; ++ j)
        {
            double x1, x2, y1, y2;
            x1 = a[i].first, y1 = a[i].second;
            x2 = a[j].first, y2 = a[j].second;
            if (x1 > x2)
            {
                swap (x1, x2);
                swap (y1, y2);
            }
            double x3, y3, x4, y4;
            double mijx = (x1 + x2) / 2.0, mijy = (y1 + y2) / 2.0;
            double dx = fabs (mijx - x1), dy = fabs(mijy - y1);
            if (y1 < y2)
            {
                x3 = mijx - dy, y3 = mijy + dx;
                x4 = mijx + dy, y4 = mijy - dx;
            }
            else
            {
                x3 = mijx - dy, y3 = mijy - dx;
                x4 = mijx + dy, y4 = mijy + dx;
            }
            if (x3 == (int)x3 && y3 == (int)y3 && x4 == (int)x4 && y4 == (int)y4 && Search((int)x3, (int)y3), Search((int)x4, (int)y4))
                ++ ans;
        }
//    for (int i = 0; i < MOD; ++ i)
//        for (vector <pii> :: iterator it = H[i].begin(); it != H[i].end(); ++ it)
//            cout << i << " " << it -> first << " " << it -> second << "\n";
    freopen("patrate3.out", "w", stdout);
    printf ("%d\n", ans / 2);
    return 0;
}