Cod sursa(job #1155481)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 26 martie 2014 22:32:15
Problema Patrate 3 Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("patrate3.in");
ofstream g("patrate3.out");
int n, st, dr, mij, i, nrp, j, ys, xs, yj, xj, oks, okj, nr;
char nr1[15], nr2[15];
double xm, ym;
struct punct{
    int x;
    int y;
}p[1001];
int modul (int x)
{
    if (x<0)
        return -x;
    return x;
}
bool cmp(const punct &p1, const punct &p2)
{
    if (p1.x == p2.x)
        return  p1.y < p2.y;
    return p1.x < p2.x;
}
int main()
{
    f>>n;
    for (i=1; i<=n; i++) {
        f>>nr1;
        f>>nr2;
        nr=0;
        j=0;
        while (nr1[j]!=0) {
            if (nr1[j]!='.')
                nr=nr*10+(nr1[j]-'0');
            j++;
        }
        p[i].x=nr;
        nr=0;
        j=0;
        while (nr2[j]!=0) {
            if (nr2[j]!='.')
                nr=nr*10+(nr2[j]-'0');
            j++;
        }
        p[i].y=nr;
    }
    sort (p + 1, p+n+1, cmp);
    for (i=1; i<=n; i++) {
        for (j=i+1; j<=n; j++) {
            xm=(p[i].x+p[j].x)/2;
            ym=(p[i].y+p[j].y)/2;
            if (p[i].y >= p[j].y) {
                xs=xm+modul(ym-p[i].y);
                ys=ym+modul(xm-p[i].x);
                xj=xm-modul(ym-p[i].y);
                yj=ym-modul(xm-p[i].x);
            }
            else {
                xs=xm-modul(ym-p[i].y);
                ys=ym+modul(xm-p[i].x);
                xj=xm+modul(ym-p[i].y);
                yj=ym-modul(xm-p[i].x);
            }
            st=i+1;
            dr=j-1;
            oks=0;
            while (st<=dr) {
                mij=(st+dr)/2;
                if (p[mij].x > xs)
                    dr=mij-1;
                else if (p[mij].x < xs)
                    st=mij+1;
                else
                    if (p[mij].y == ys) {
                        oks=1;
                        break;
                    }
            }
            okj=0;
            st=i+1;
            dr=j-1;
            while (st<=dr) {
                mij=(st+dr)/2;
                if (p[mij].x > xj)
                    dr=mij-1;
                else if (p[mij].x < xj)
                    st=mij+1;
                else
                    if (p[mij].y == yj) {
                        okj=1;
                        break;
                    }
            }
            if (oks==1 && okj==1)
                nrp++;
        }
    }
    g<<nrp;
    return 0;
}