码题集OJ-距离平方和 (matiji.net)
推算
求两个点之间的距离公式为:
d i s t = ( x 1 − x 2 ) 2 − ( y 1 − y 2 ) 2 dist=\sqrt{(x1-x2)^2-(y1-y2)^2} d i s t = ( x 1 − x 2 ) 2 − ( y 1 − y 2 ) 2
因为题目求的是距离的平方和,因此,我们可以不用要根号了,直接写为如下:
d i s t 2 = ( x 1 − x 2 ) 2 − ( y 1 − y 2 ) 2 dist^2=(x1-x2)^2-(y1-y2)^2 d i s t 2 = ( x 1 − x 2 ) 2 − ( y 1 − y 2 ) 2
然后我们就只看 ( x 1 − x 2 ) 2 (x1-x2)^2 ( x 1 − x 2 ) 2 这半部分:
这半部分可以展开为:
x 1 + x 2 − 2 x 1 ∗ x 2 x1+x2-2x1*x2 x 1 + x 2 − 2 x 1 ∗ x 2
这个公式又可以拆为:x 1 + x 2 x1+x2 x 1 + x 2 ,
− 2 x 1 ∗ x 2 -2x1*x2 − 2 x 1 ∗ x 2 两部分。
先看x 1 + x 2 x1+x2 x 1 + x 2 这部分。因为有n个点,每个点都要求与其他点的距离。
因此这部分要∗ ( n − 1 ) *(n-1) ∗ ( n − 1 )
再看2 x 1 ∗ x 2 2x1*x2 2 x 1 ∗ x 2 这部分,同样因为有n个点,因此可以表示为:
2 x 1 ∗ x 2 + 2 x 2 ∗ x i + 2 x 3 ∗ x i + … … 2 x n ∗ x i 2x1*x2 + 2x2 * xi +2x3*xi + ……2xn*
xi 2 x 1 ∗ x 2 + 2 x 2 ∗ x i + 2 x 3 ∗ x i + …… 2 x n ∗ x i
然后我们把2和xi提取出来,变为如下:
2 x i ( x 1 + x 2 + x 3 + x 4 + x 5 + … … + x n ) 2xi(x1+x2+x3+x4+x5+……+xn) 2 x i ( x 1 + x 2 + x 3 + x 4 + x 5 + …… + x n )
我们发现 x 1 + x 2 + x 3 + x 4 + … … + x n x1+x2+x3+x4+……+xn x 1 + x 2 + x 3 + x 4 + …… + x n 可以用前缀和去求。
code
#include<bits/stdc++.h >
#define int long long
using namespace std;
int ans;
int sx,sy,n;
signed main ( )
{
cin>>n;
for (int i=0 ;i<n;i++)
{
int x,y;cin>>x>>y;
ans+=(n-1 )*(x*x+y*y)-((x*sx+y*sy)*2 );
sx+=x,sy+=y;
}
cout<<ans;
return 0 ;
}