Cod sursa(job #1396295)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 22 martie 2015 13:30:41
Problema Patrate 3 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>
#include <cmath>
#define MOD 50013

using namespace std;

struct point{
    int x,y;
}v[1005];
struct segment{
    float angle;
    float length;
    point a,b;
};
long long int squaredist(point a,point b){
    return 1LL*(a.x-b.x)*(a.x-b.x)+1LL*(a.y-b.y)*(a.y-b.y);
}
int Area(point p1,point p2,point p3){
    return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}
vector <segment> H[MOD];
int N,nr;
int SquaresCount;

ifstream fin("patrate3.in");
ofstream fout("patrate3.out");

void pars(int &a){
    char s[20];
    fin>>s;
    int i=0,x=0,y=0,semn=1;
    if(s[0]=='-')
        semn=-1,i++;
    while(s[i]>='0' && s[i]<='9'){
        x=x*10+s[i]-'0';
        i++;
    }
    i++;
    while(s[i]>='0' && s[i]<='9'){
        y=y*10+s[i]-'0';
        i++;
    }
    x=x*semn;
    if(x<0)
        a=x*10000-y;
    else
        a=x*10000+y;
}
int main(){
    fin>>N;
    for(int i=1;i<=N;i++){
        pars(v[i].x);
        pars(v[i].y);
    }
    for(int i=1;i<N;i++)
        for(int j=i+1;j<=N;j++){
            segment x;
            x.angle=(v[i].y-v[j].y)/(float)(v[i].x-v[j].x);
            long long Length=1LL*squaredist(v[i],v[j]);
            x.length=sqrt((float)Length);
            x.a=v[i];
            x.b=v[j];
            int mod=Length%MOD;
            for(int d=0;d<H[mod].size();d++)
                if(x.angle==H[mod][d].angle && x.length==H[mod][d].length){
                    if(Length==min(squaredist(x.a,H[mod][d].a),squaredist(x.a,H[mod][d].b)))
                        SquaresCount++;
                }
            H[mod].push_back(x);
        }
    fout<<SquaresCount/2<<"\n";
}