Pagini recente » Cod sursa (job #1855468) | Cod sursa (job #581395) | Cod sursa (job #2417873) | Cod sursa (job #2507803) | Cod sursa (job #2757207)
#include <iostream>
#include <iomanip>
#include <fstream>
#include <complex>
#include <cmath>
#include <algorithm>
#define _USE_MATH_DEFINES
using namespace std;
const int NMAX = 1505;
complex<double> pt[NMAX];
int N;
const double EPS = 1e-5;
void read() {
ifstream f("triang.in");
f >> N;
for (int i = 1; i <= N; i++) {
double x, y;
f >> x >> y;
pt[i] = complex<double>(x, y);
}
}
complex<double> rotate(const complex<double>& z, double u) {
return z * exp(1i * u);
}
bool exists(const complex<double>& z, int s) {
return binary_search(
pt + s,
pt + N + 1,
z,
[](const auto& z1, const auto& z2) -> bool{
if (abs(real(z1) - real(z2)) <= EPS)
return abs(imag(z1) - imag(z2)) > EPS;
return abs(real(z1) - real(z2)) > EPS;
}
);
}
void solve() {
int triangles = 0;
for (int i = 1; i <= N; i++) {
for (int j = i+1; j <= N; j++) {
auto z = pt[j] - pt[i];
for (const double u: {M_PI/3, -M_PI/3}) {
auto rot = rotate(z, u);
auto c = pt[j] - rot;
if (exists(c, j)) ++triangles;
}
}
}
ofstream g("triang.out");
g << triangles;
}
int main() {
read();
sort(pt + 1, pt + N + 1, [](const auto& z1, const auto& z2) -> bool {
if (abs(real(z1) - real(z2)) < EPS)
return imag(z1) < imag(z2);
return real(z1) < real(z2);
});
solve();
}