Pagini recente » Cod sursa (job #1143878) | Cod sursa (job #2340903) | Cod sursa (job #1866986) | Cod sursa (job #2331080) | Cod sursa (job #2261055)
#include <fstream>
#include <algorithm>
#define DIM 1010
using namespace std;
ifstream fin ("trapez.in");
ofstream fout ("trapez.out");
long long n,i,k,ap,sol,j;
struct punct {
long long x;
long long y;
};
punct v[DIM];
struct segment {
long long x;
long long y;
long long x2;
long long y2;
};
segment d[DIM*DIM];
int cmp2 (punct a, punct b){
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
pair<long long,long long> tangenta (segment a){
pair <long long,long long> val;
val.first = a.x2 - a.x;
val.second = a.y2 - a.y;
if (val.second < 0) val.second = -val.second;
return make_pair(val.second,val.first);
}
int cadran (segment a){
if (a.y <= a.y2)
return 1;
return 2;
}
int cmp (segment a, segment b){
pair <long long,long long> nr1,nr2;
nr1 = tangenta (a);
nr2 = tangenta (b);
if (cadran(a) != cadran (b))
return cadran(a) < cadran (b);
else
return nr1.first*nr2.second < nr1.second*nr2.first;
}
int verif (long long i, long long j){
pair <long long,long long> nr1,nr2;
nr1 = tangenta (d[i]);
nr2 = tangenta (d[j]);
if (nr1.first*nr2.second == nr1.second*nr2.first && cadran(d[i]) == cadran(d[j]))
return 1;
return 0;
}
int main (){
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i].x>>v[i].y;
sort (v+1,v+n+1,cmp2);
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++){
k++;
d[k].x = v[i].x;
d[k].y = v[i].y;
d[k].x2 = v[j].x;
d[k].y2 = v[j].y;
}
/// sortam dupa cadram si in caz de egalitate dupa unghi
/// retinem tangenta
sort (d+1,d+k+1,cmp);
ap = 1;
for (i=2;i<=k+1;i++){
if (verif(i,i-1))
ap++;
else{
/// sol += comb ap, 2
sol += ap*(ap-1)/2;
ap = 1;
}
}
fout<<sol;
return 0;
}