Pagini recente » Cod sursa (job #2851064) | Cod sursa (job #1755498) | Cod sursa (job #2562176) | Cod sursa (job #129289) | Cod sursa (job #24829)
Cod sursa(job #24829)
#include<stdio.h>
#define nmax 1003
#define nrmax 1000010
#define fin "trapez.in"
#define fout "trapez.out"
int long n,i,j;
struct puncte
{unsigned long x,y;} punct[nmax];
struct
{unsigned long x,y;} pct[3];
void citire();
void afisare(int long);
int long rezolva();
void form_pct();
int main()
{citire();
afisare(rezolva());
return 0;
}
void citire()
{int long i;
freopen(fin,"r",stdin);
scanf("%ld",&n);
for(i=1;i<=n;i++)
scanf("%lu %lu",&punct[i].x,&punct[i].y);
}
void afisare(int long sol)
{freopen(fout,"w",stdout);
printf("%ld",sol);
fclose(stdout);
}
int long ordoneaza(unsigned long x[nrmax],unsigned long y[nrmax],unsigned long n)
{int long i,j,aux,sol=0,nr;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((long long)y[i]*x[j]<(long long)y[j]*x[i]);
{aux=x[i];
x[i]=x[j];
x[j]=aux;
aux=y[i];
y[i]=y[j];
y[j]=aux;
}
for(i=1;i<=n;i++)
{j=i;nr=0;
while((long long)y[i]*x[i+1]==(long long)y[i+1]*x[i])
j++;
nr=j-i+1;
i=j;
sol+=(long long)nr*(nr-1)/2;
}
return sol;
}
int long rezolva()
{int long oriz=0,vert=0,sol=0,x,y;
struct
{unsigned long x[nrmax],y[nrmax],n;} cadr[3];
cadr[1].n=cadr[2].n=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{form_pct();
x=pct[2].x-pct[1].x;
y=pct[2].y-pct[1].y;
if(y==0)
oriz++;
else
if(x==0)
vert++;
if(x>0)
{cadr[1].x[++cadr[1].n]=x;
cadr[1].y[cadr[1].n]=y;
}
else
{cadr[2].x[++cadr[2].n]=-1*x;
cadr[2].y[cadr[2].n]=y;
}
}
sol=(long long)oriz*(oriz-1)/2+vert*(vert-1)/2;
sol+=ordoneaza(cadr[1].x,cadr[1].y,cadr[1].n);
sol+ordoneaza(cadr[2].x,cadr[2].y,cadr[2].n);
return sol;
}
void form_pct()
{
if(punct[i].y<punct[j].x)
{pct[1].y=punct[i].y;
pct[1].x=punct[i].x;
pct[2].y=punct[j].y;
pct[2].x=punct[j].x;
}
else
{pct[1].y=punct[j].y;
pct[1].x=punct[j].x;
pct[2].y=punct[i].y;
pct[2].x=punct[i].x;
}
}