Pagini recente » Cod sursa (job #132885) | Diferente pentru implica-te/arhiva-educationala intre reviziile 65 si 64 | w1 | Cod sursa (job #3200544) | Cod sursa (job #2283238)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
struct Punct {
long long int x, y;
};
struct Dreapta {
Punct p1, p2;
};
inline bool cmp(Dreapta d1, Dreapta d2) {
return ( ( (d1.p2.y - d1.p1.y) * (d2.p2.x - d2.p1.x) < (d2.p2.y - d2.p1.y) * (d1.p2.x - d1.p1.x) ) ? 1:0 );
}
inline bool cmp2(Punct p1, Punct p2) {
return ( (p1.x < p2.x) ? 1:0 );
}
bool commonTg(Dreapta, Dreapta);
int main() {
ifstream f("trapez.in");
ofstream g("trapez.out");
long long int n, nrDrepte;
f >> n;
Punct p[n];
for (long long int i = 0; i < n; ++i) {
f >> p[i].x >> p[i].y;
}
sort(p, p + n, cmp2);
Dreapta d[n * n];
nrDrepte = 0;
for (long long int i = 0; i < n; ++i) {
for (long long int j = i + 1; j < n; ++j) {
d[nrDrepte].p1 = p[i];
d[nrDrepte].p2 = p[j];
nrDrepte ++;
}
}
sort(d, d + nrDrepte, cmp);
long long int nrCurrent = 1;
long long int answer = 0;
for (int i = 1; i < nrDrepte; ++i) {
if ( commonTg(d[i], d[i - 1]) ) {
nrCurrent ++;
} else {
answer += (nrCurrent * (nrCurrent - 1) / 2 );
nrCurrent = 1;
}
}
/*
for (int i = 0; i < nrDrepte; ++i) {
cout << d[i].p1.x << " " << d[i].p1.y << " " << d[i].p2.x << " " << d[i].p2.y << "\n";
}
*/
g << answer;
return 0;
}
bool commonTg(Dreapta d1, Dreapta d2) {
return ( ( (d1.p2.y - d1.p1.y) * (d2.p2.x - d2.p1.x) == (d2.p2.y - d2.p1.y) * (d1.p2.x - d1.p1.x) ) ? 1:0 );
}