Pagini recente » Cod sursa (job #3123863) | Cod sursa (job #2542056) | Istoria paginii runda/corona_day7 | Cod sursa (job #1328081) | Cod sursa (job #596879)
Cod sursa(job #596879)
# include <fstream>
# include <algorithm>
# include <math.h>
using namespace std;
ifstream f ("triang.in");
ofstream g ("triang.out");
struct punct { double x, y; } a[1501];
double eps = 0.001;
double si, co = 0.5;
int n, i, j, sol;
inline double abss (double a)
{
return a < 0 ? a * -1.0 : a;
}
inline bool egal (double a, double b)
{
return abss (a - b) < eps;
}
inline bool mic (double a, double b)
{
return a - b < eps;
}
inline bool cmp (punct a, punct b)
{
if (egal (a.x, b.x))
return mic (a.y, b.y);
return mic (a.x, b.x);
}
inline punct p1 (punct a, punct b)
{
punct c;
c.x = a.x + (b.x - a.x) * co - (b.y - a.y) * si;
c.y = a.y + (b.x - a.x) * si + (b.y - a.y) * co;
return c;
}
inline punct p2 (punct a, punct b)
{
punct c;
c.x = a.x + (b.x - a.x) * co + (b.y - a.y) * si;
c.y = a.y - (b.x - a.x) * si + (b.y - a.y) * co;
return c;
}
/*inline int bs (punct p, int dr)
{
int i, cnt = 1 << 11;
for (i = dr; cnt > 0; cnt >>= 1)
if (i + cnt <= n)
if (mic (a[i + cnt].x, p.x) || (egal (a[i + cnt].x, p.x) && mic (a[i + cnt].y, p.y))) i += cnt;
return (egal (a[i].x, p.x) && egal (a[i].y, p.y) ? 1 : 0);
}*/
inline int bs (punct c, int j)
{
int i, cnt = (1 << 11);
for (i = j; cnt > 0; cnt >>= 1)
{
int aux = i + cnt;
if (aux <= n)
{
if (mic (a[aux].x, c.x) || (egal (a[aux].x, c.x) && mic (a[aux].y, c.y))) i = aux;
}
}
//if (i <= n)
return (egal (c.x, a[i].x) && egal (c.y, a[i].y) ? 1 : 0);
//else
//return 0;
}
int main ()
{
si = sqrt (3.0) / 2;
f >> n;
for (i = 1; i <= n; ++i)
f >> a[i].x >> a[i].y;
sort (a + 1, a + n + 1, cmp);
for (i = 1; i < n - 1; ++i)
for (j = i + 1; j < n; ++j)
{
if (bs (p1 (a[i], a[j]), j + 1)) ++sol;
if (bs (p2 (a[i], a[j]), j + 1)) ++sol;
}
g << sol << '\n';
g.close ();
return 0;
}