Pagini recente » Cod sursa (job #245929) | Cod sursa (job #1184897) | Cod sursa (job #787708) | Cod sursa (job #1319446) | Cod sursa (job #482596)
Cod sursa(job #482596)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<complex>
#define x first
#define y second
using namespace std;
const int NMAX = 3010;
const int lgNMAX = 11;
const int INF = 1000000;
pair<double, double> coord[NMAX];
int N;
double rad3 = sqrt((double)3);
long long SOL;
void citire()
{
cin >> N;
for(int i = 1 ; i <= N ; i++)
cin >> coord[i].x >> coord[i].y;
for(int i = N + 1 ; i < NMAX ; i++)
coord[i].x = INF, coord[i].y = INF;
}
bool cautare_bin(pair<double, double> varf)
{
pair<long long, long long> V, CR;
int p = 1<<lgNMAX, rez = 0;
V.x = (double)1000 * varf.x;
V.y = (double)1000 * varf.y;
if(!V.x && !V.y) return 0;//aici trebuie schimbat
while(p)
{
CR.x = (double)1000 * coord[rez + p].x;
CR.y = (double)1000 * coord[rez + p].y;
if(CR.x == 1000 * INF && CR.y == 1000 * INF);
else if(V == CR)
return 1;
else if(V > CR)
rez += p;
p >>= 1;
}
return 0;
}
void rez()
{
pair<double, double>varf;
for(int i = 1 ; i < N ; i++)
for(int j = i + 1 ; j <= N ; j++)
{
pair<double, double> n1, n2;
n1.x = coord[i].x;n1.y = coord[i].y;
n2.x = coord[j].x;n2.y = coord[j].y;
varf.first = (n1.x + n2.x + (n2.y - n1.y)* rad3)/2;
varf.second = ((n1.x - n2.x) * rad3 + n1.y + n2.y)/2;
SOL += cautare_bin(varf);
varf.first = (n1.x + n2.x + (n1.y - n2.y) * rad3)/2;
varf.second = ((n2.x - n1.x) * rad3 + n1.y + n2.y)/2;
SOL += cautare_bin(varf);
}
}
int main()
{
freopen("triang.in", "r", stdin);
freopen("triang.out", "w", stdout);
citire();
sort(coord + 1, coord + N + 1);
rez();
printf("%lld\n", SOL);
return 0;
}