Cod sursa(job #2351862)

Utilizator DragosArseneDragos Arsene DragosArsene Data 22 februarie 2019 19:21:10
Problema Patrate 3 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.22 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct cor{long long x, y;};
cor v[1001];
bool cmp(cor a, cor b){
    if(a.x<b.x)
        return true;
    else{
        if(a.x>b.x)
        return false;
        else{
            if(a.y<b.y)
                return true;
            else
                return false;
        }
    }
}



int main() {
    int n, i, j, dr, stg1, mijl1, mijl2, contor=0, stg2;
    long long  xci, yci, xcj, ycj, xd, yd,  centrux, centruy, vectorx, vectory;
    double g1, g2;
    char c;
    FILE *fin, *fout;

fin = fopen("patrate3.in", "r");
fout = fopen("patrate3.out", "w");

fscanf(fin,"%d", &n);
c=fgetc(fin);
for(i=1;i<=n;i++){
    c='0';
    while(c!=' '){
        c=fgetc(fin);
        if(c!='.'&&c!=' '){
        v[i].x*=10;
        v[i].x+=c-'0';
        }
    }

    c='0';
    while(c!='\n'&&c!=EOF){
        c=fgetc(fin);
        if(c!='.'&&c!='\n'){
        v[i].y*=10;
        v[i].y+=c-'0';
        }
    }



}
sort(v+1,v+n+1,cmp);

for(i=1;i<=n;i++){
    for(j=i+1;j<=n;j++){
        if(i!=j){
        //punctele sunt alaturate
        if(v[i].y>v[j].y)
            xd=v[j].x-v[i].x;
        else
            xd=v[i].x-v[j].x;
        yd=abs(v[i].y-v[j].y);

        xci=v[i].x+yd;
        yci=v[i].y+xd;
        xcj=v[j].x+yd;
        ycj=v[j].y+xd;


    stg1=j;
    dr=n+1;

    while(dr-stg1>0){
        mijl1=(stg1+dr)/2+1;
        if(v[mijl1].x==xci&&v[mijl1].y==yci){
            stg1=mijl1;
            break;
        }
        if(v[dr].x==xci&&v[dr].y==yci){
            stg1=dr;
            break;
        }
        if(v[mijl1].x>=xci)
            dr=mijl1-1;
        else{
            if(v[mijl1].x<xci)
            stg1=mijl1+1;
            else{
                if(v[mijl1].y>=yci)
                    dr=mijl1-1;
                else
                    stg1=mijl1+1;
            }
        }
    }

    stg2=j;
    dr=n+1;
    while(dr-stg2>0){
        mijl2=(dr+stg2)/2+1;
        if(v[mijl2].x==xcj&&v[mijl2].y==ycj){
            stg2=mijl2;
            break;
        }
        if(v[dr].x==xcj&&v[dr].y==ycj){
            stg2=dr;
            break;
        }
        if(v[mijl2].x>=xcj)
            dr=mijl2-1;
        else{
            if(v[mijl2].x<xcj)
            stg2=mijl2+1;
            else{
                if(v[mijl2].y>=ycj)
                    dr=mijl2-1;
                else
                    stg2=mijl2+1;
            }
        }
    }
    if(v[stg1].x==xci&&v[stg1].y==yci&&v[stg2].x==xcj&&v[stg2].y==ycj)
        contor++;


    //punctele sunt opuse
    centrux=(v[i].x+v[j].x)/2;
    centruy=(v[i].y+v[j].y)/2;
    vectorx=v[i].y-centruy;
    vectory=v[i].x-centrux;
    xci=centrux-vectorx;
    yci=centruy+vectory;
    xcj=centrux+vectorx;
    ycj=centruy-vectory;

    stg1=j;
    dr=n+1;

    while(dr-stg1>0){
        mijl1=(stg1+dr)/2+1;
        if(v[mijl1].x==xci&&v[mijl1].y==yci){
            stg1=mijl1;
            break;
        }
        if(v[dr].x==xci&&v[dr].y==yci){
            stg1=mijl1;
            break;
        }
        if(v[mijl1].x>xci)
            dr=mijl1-1;
        else{
            if(v[mijl1].x<xci)
            stg1=mijl1+1;
            else{
                if(v[mijl1].y>=yci)
                    dr=mijl1-1;
                else
                    stg1=mijl1+1;
            }
        }
    }

    stg2=j;
    dr=n+1;
    while(dr-stg2>0){
        mijl2=(dr+stg2)/2+1;
        if(v[mijl2].x==xcj&&v[mijl2].y==ycj){
            stg2=mijl2;
            break;
        }
        if(v[dr].x==xcj&&v[dr].y==ycj){
            stg2=dr;
            break;
        }
        if(v[mijl2].x>xcj)
            dr=mijl2-1;
        else{
            if(v[mijl2].x<xcj)
            stg2=mijl2+1;
            else{
                if(v[mijl2].y>=ycj)
                    dr=mijl2-1;
                else
                    stg2=mijl2+1;
            }
        }
    }

    if(v[stg1].x==xci&&v[stg1].y==yci&&v[stg2].x==xcj&&v[stg2].y==ycj)
        contor++;

        }

    }
}













fprintf(fout,"%d", contor);
fclose(fin);
fclose(fout);
    return 0;
}