Cod sursa(job #2351968)

Utilizator DragosArseneDragos Arsene DragosArsene Data 22 februarie 2019 20:56:47
Problema Patrate 3 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct cor{long long x, y;};
cor v[1001];
int n, i, j, dr, stg, mijl, contor=0;
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;
        }
    }
}

bool gasit(long long corx, long long cory){

    while(stg<=dr){
        mijl=(stg+dr)/2;
        if(v[mijl].x==corx&&v[mijl].y==cory)
                return true;


        if(v[mijl].x>corx)
            dr=mijl-1;
        else{
            if(v[mijl].x<corx)
            stg=mijl+1;
            else{
                if(v[mijl].y>=cory)
                    dr=mijl-1;
                else
                    stg=mijl+1;
            }
        }
    }
    return false;




}

int main() {

    long long  xci, yci, xcj, ycj, xd, yd,  centrux, centruy, vectorx, vectory , steag1, steag2;
    char c;
    int g1, g2;
    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++){
        fscanf(fin, "%d.%d", &g1, &g2);
		if(g1>=0)
            v[i].x = (g1 * 10000 + g2) * 10;
        else
            v[i].x = (g1 * 10000 - g2) * 10;


		fscanf(fin, " %d.%d", &g1, &g2);
        if(g1>=0)
            v[i].y = (g1 * 10000 + g2) * 10;
        else
            v[i].y = (g1 * 10000 - g2) * 10;



}
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;
        stg=j;
        dr=n+1;
        if(gasit(xci, yci)==true&&gasit(xcj, ycj)==true)
            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;

    if(gasit(xci, yci)==true&&gasit(xcj, ycj)==true)
            contor++;

        }

    }
}
/*
for(i=1;i<=n;i++){
    fprintf(fout,"%lld %lld\n", v[i].x, v[i].y);
}
*/


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