Pagini recente » Cod sursa (job #690763) | Cod sursa (job #2780833) | Cod sursa (job #865594) | Cod sursa (job #1960831) | Cod sursa (job #2146290)
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<bitset>
#define eps 1e-3
using namespace std;
pair<double,double>v[1505];
vector<pair<double,int> >pct[1505];
bitset<1505>calc,calc2;
int main(){
freopen("triang.in","r",stdin);
freopen("triang.out","w",stdout);
int n,i,j,st,dr,mij,last,e;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf%lf",&v[i].first,&v[i].second);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++){
double dist=sqrt((double)(v[i].first-v[j].first)*(v[i].first-v[j].first)+(double)(v[i].second-v[j].second)*(v[i].second-v[j].second));
pct[i].push_back(make_pair(dist,j));
pct[j].push_back(make_pair(dist,i));}
for(i=1;i<=n;i++)
sort(pct[i].begin(),pct[i].end());
long long rasp=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (i!=j){
double dist=sqrt((double)(v[i].first-v[j].first)*(v[i].first-v[j].first)+(double)(v[i].second-v[j].second)*(v[i].second-v[j].second));
calc.reset();
st=0;
dr=n-2;
last=-1;
while(st<=dr){
mij=(st+dr)/2;
if (abs(pct[i][mij].first-dist)<eps){
last=mij;
dr=mij-1;
continue;}
if (pct[i][mij].first<eps)
st=mij+1;
else
dr=mij-1;}
if (last!=-1)
for(e=last;abs(pct[i][e].first-dist)<eps && e<=n-2;e++)
calc[pct[i][e].second]=1;
calc2.reset();
st=0;
dr=n-2;
last=-1;
while(st<=dr){
mij=(st+dr)/2;
if (abs(pct[j][mij].first-dist)<eps){
last=mij;
dr=mij-1;
continue;}
if (pct[j][mij].first<eps)
st=mij+1;
else
dr=mij-1;}
if (last!=-1)
for(e=last;abs(pct[j][e].first-dist)<eps && e<=n-2;e++)
calc2[pct[j][e].second]=1;
calc=calc&calc2;
rasp=rasp+calc.count();}
printf("%lld\n",rasp/6);
return 0;}