Pagini recente » Diferente pentru utilizator/mihaig intre reviziile 2 si 1 | Atasamentele paginii Profil danhepai | Istoria paginii utilizator/alessaulea | Monitorul de evaluare | Cod sursa (job #1448045)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define inFile "trapez.in"
#define outFile "trapez.out"
#define MAX_P 1001
#define MAX_L 500001
#define INF 1<<30
#define ERR 1e-7
FILE *in = fopen(inFile, "r");
FILE *out = fopen(outFile, "w");
struct Point {
double x;
double y;
};
double Slope[MAX_L];
Point P[MAX_P];
inline bool Equal(double A, double B);
inline bool Lesser(double A, double B);
inline double getSlope(Point A, Point B);
int main() {
int N, nLines = 0, i, j, nParralel;
long long nTrapezoid = 0;
fscanf(in, "%d", &N);
for(i = 1; i <= N; i++)
fscanf(in, "%lf %lf", &P[i].x, &P[i].y);
for(i = 1; i <= N; i++) {
for(j = i+1; j <= N; j++) {
++nLines;
if(P[j].x == P[i].x) Slope[nLines] = INF;
else Slope[nLines] = (P[j].y - P[i].y) / (P[j].x - P[i].x);
}
}
sort(Slope + 1, Slope + nLines + 1);
//for(i = 1; i <= nLines; i++) fprintf(out, "%f - %f ----- %f - %f ----- %f\n", L[i].A.x, L[i].A.y, L[i].B.x, L[i].B.y, L[i].Slope);
for(i = 1; i <= nLines; ) {
for(j = i; Slope[i] == Slope[j]; i++);
nParralel = i-j;
nTrapezoid += (nParralel * (nParralel - 1)) / 2;
}
fprintf(out, "%lld\n", nTrapezoid);
fclose(in);
fclose(out);
return 0;
}
inline bool Equal(double A, double B) {
return fabs(A-B) < ERR;
}
inline bool Lesser(double A, double B) {
return B-A > ERR;
}
inline double getSlope(Point A, Point B) {
if(A.x == B.x) return INF;
return (B.y - A.y) / (B.x - A.x);
}