#include<bits/stdc++.h>
using namespace std;
struct zhengs{
int x,y;
long long dis;
int v;
}ris[2000005];
struct fus{
int x,y;
long long dis;
int v;
}les[2000005];
struct zhengx{
int x,y;
long long dis;
int v;
}rix[2000005];
struct fux{
int x,y;
long long dis;
int v;
}lex[2000005];
struct stu{
int x,y;
long long z;
}a[2000005];
int n,x[2005],y[2005],m,fa[2005],k,you[2005],len;
unsigned long long cnt;
int getfa(int x)
{
if(fa[x]!=x) fa[x]=getfa(fa[x]);
return fa[x];
}
void unionn(int x,int y)
{
int r1=getfa(x),r2=getfa(y);
if(r1!=r2) fa[r1]=r2;
}
int xi(double xx)
{
xx=abs(xx);
while(xx<100000&&xx!=0) xx*=10;
return abs((int)xx);
}
bool cmp(stu x,stu y)
{
return x.z<y.z;
}
int main()
{
freopen("13.in","r",stdin);
freopen("13.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<2003;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
double xie;
if(x[i]-x[j]==0) xie=1000001.00;
else xie=(double)(y[i]-y[j])/(x[i]-x[j]);
int xiee=xi(xie);
you[++len]=xiee;
long long ju=(long long)sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
if(x[i]<=x[j])
{
if(y[j]>=y[i])
{
if(ris[xiee].v==1)
{
if(ris[xiee].dis>ju)
{
ris[xiee].dis=ju;
ris[xiee].x=i;
ris[xiee].y=j;
}
}
else
{
ris[xiee].dis=ju;
ris[xiee].v=1;
ris[xiee].x=i;
ris[xiee].y=j;
}
}
else
{
if(rix[xiee].v==1)
{
if(rix[xiee].dis>ju)
{
rix[xiee].dis=ju;
rix[xiee].x=i;
rix[xiee].y=j;
}
}
else
{
rix[xiee].dis=ju;
rix[xiee].v=1;
rix[xiee].x=i;
rix[xiee].y=j;
}
}
}
else
{
if(y[j]>=y[i])
{
if(les[xiee].v==1)
{
if(les[xiee].dis>ju)
{
les[xiee].dis=ju;
les[xiee].x=i;
les[xiee].y=j;
}
}
else
{
les[xiee].dis=ju;
les[xiee].v=1;
les[xiee].x=i;
les[xiee].y=j;
}
}
else
{
if(lex[xiee].v==1)
{
if(lex[xiee].dis>ju)
{
lex[xiee].dis=ju;
lex[xiee].x=i;
lex[xiee].y=j;
}
}
else
{
lex[xiee].dis=ju;
lex[xiee].v=1;
lex[xiee].x=i;
lex[xiee].y=j;
}
}
}
}
}
for(int i=1;i<=len;i++)
{
if(ris[you[i]].v!=0&&ris[you[i]].x!=0) a[++m].x=ris[you[i]].x,a[m].y=ris[you[i]].y,a[m].z=ris[you[i]].dis;
if(les[you[i]].v!=0&&les[you[i]].x!=0) a[++m].x=les[you[i]].x,a[m].y=les[you[i]].y,a[m].z=les[you[i]].dis;
if(rix[you[i]].v!=0&&rix[you[i]].x!=0) a[++m].x=rix[you[i]].x,a[m].y=rix[you[i]].y,a[m].z=rix[you[i]].dis;
if(lex[you[i]].v!=0&&lex[you[i]].x!=0) a[++m].x=lex[you[i]].x,a[m].y=lex[you[i]].y,a[m].z=lex[you[i]].dis;
}
memset(ris,0,sizeof(ris));
memset(les,0,sizeof(ris));
memset(rix,0,sizeof(ris));
memset(lex,0,sizeof(ris));
memset(you,0,sizeof(you));
len=0;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(getfa(a[i].x)!=getfa(a[i].y))
{
unionn(a[i].x,a[i].y);
cnt+=a[i].z%191981000;
k++;
}
if(k==n-1) break;
}
cout<<cnt%191981000;
return 0;
}
我自己只能看出是 O(n2) 的,但实际上n为440时程序跑了6.5s