Cod sursa(job #1382818)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 9 martie 2015 16:35:56
Problema Patrate 3 Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <ctype.h>
#define MAXN 1000
#define HASH 666013
long long val[MAXN+1], l[MAXN], c[MAXN];
int next[MAXN+1], lista[HASH+1], m;
FILE *fin;
inline int exista(long long k){
    int p=lista[k%HASH], f=0;
    while((p!=0)&&(f==0)){
        if(val[p]==k){
            f=1;
        }
        p=next[p];
    }
    return f;
}
inline void adauga(long long k){
    val[++m]=k;
    next[m]=lista[k%HASH];
    lista[k%HASH]=m;
}
inline int citeste(){
    int x=0;
    char ch=fgetc(fin);
    while(!isdigit(ch)){
        ch=fgetc(fin);
    }
    while(ch!='.'){
        x=x*10+ch-'0';
        ch=fgetc(fin);
    }
    ch=fgetc(fin);
    while(isdigit(ch)){
        x=x*10+ch-'0';
        ch=fgetc(fin);
    }
    return x;
}
int main(){
    int n, i, j, ans;
    long long a, b, x, y;
    FILE *fout;
    fin=fopen("patrate3.in", "r");
    fout=fopen("patrate3.out", "w");
    fscanf(fin, "%d ", &n);
    for(i=0; i<n; i++){
        l[i]=citeste();
        c[i]=citeste();
        adauga((l[i]<<27LL)+c[i]);
    }
    ans=0;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            if((i!=j)&&(c[i]<=c[j])&&(l[i]>l[j])){
                a=l[i]+c[j]-c[i];
                b=c[i]+l[i]-l[j];
                x=l[j]+c[j]-c[i];
                y=c[j]+l[i]-l[j];
                ans+=(exista((a<<27LL)+b)&exista((x<<27LL)+y));
            }
        }
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}