Pagini recente » Cod sursa (job #109280) | Cod sursa (job #3149233) | Cod sursa (job #2048548) | Cod sursa (job #503579) | Cod sursa (job #2067568)
#include<algorithm>
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("trapez.in");
ofstream out("trapez.out");
struct pct{
int y,x;
};
struct panta{
int index1, index2;
int dy, dx;
};
int abss(int x){
if(x < 0) return -x;
return x;
}
int comparPante(panta a, panta b){
if(a.dx == 0) return 0;
if(b.dx == 0) return 1;
long long produs1 = abss( (long long) a.dx * b.dy);
long long produs2 = abss( (long long) b.dx * a.dy);
if( (a.dx<0 && a.dy>0) || (a.dx>0 && a.dy<0)) produs1 *= -1;
else if( (b.dx<0 && b.dy>0) || (b.dx>0 && b.dy<0)) produs2 *= -1;
return produs1 < produs2;
}
int panteEgale(panta a, panta b){
if(a.dx == 0 && b.dx == 0) return 1;
else if(a.dx == 0 || b.dx == 0) return 0;
long long produs1 = abss( (long long) a.dx * b.dy);
long long produs2 = abss( (long long) b.dx * a.dy);
if( (a.dx<0 && a.dy>0) || (a.dx>0 && a.dy<0)) produs1 *= -1;
if( (b.dx<0 && b.dy>0) || (b.dx>0 && b.dy<0)) produs2 *= -1;
return produs1 == produs2;
}
const int N = 1000;
panta pante[N*N];
pct puncte[N];
int n,nPante;
int main()
{
in>>n;
for(int i=0; i<n; ++i)
in>>puncte[i].x>>puncte[i].y;
nPante = 0;
for(int i=0; i<n; ++i)
for(int j=i+1; j<n; ++j){
pante[nPante].index1 = i;
pante[nPante].index2 = j;
pante[nPante].dx = (puncte[j].x - puncte[i].x);
pante[nPante].dy = (puncte[j].y - puncte[i].y);
++nPante;
}
///for(int i=0; i<nPante; ++i) cout<<pante[i].index1<<" "<<pante[i].index2<<" "<<(1.0 * pante[i].dy / pante[i].dx)<<"\n"; cout<<"\n";
sort(pante, pante+nPante, comparPante);
///for(int i=0; i<nPante; ++i) cout<<pante[i].index1<<" "<<pante[i].index2<<" "<<(1.0 * pante[i].dy / pante[i].dx)<<"\n"; cout<<"\n";
long long cntPanteEgale = 1;
long long cntTrapeze = 0;
for(int i=1; i<nPante; ++i)
{
int panteleSuntEgale = panteEgale(pante[i-1], pante[i]);
if(panteleSuntEgale)
++cntPanteEgale;
if(!panteleSuntEgale || i == nPante-1){
cntTrapeze += cntPanteEgale * (cntPanteEgale-1) / 2;
cntPanteEgale = 1;
}
}
out<<cntTrapeze;
return 0;
}