原题链接

3782. 点 - AcWing题库

目标需求

i<jn[(xixj)2+(yiyj)2]=i<jn(xixj)2+i<jn(yiyj)2\displaystyle \sum_{i<j}^n[(x_i-x_j)^2+(y_i-y_j)^2]=\displaystyle \sum_{i<j}^n(x_i-x_j)^2+ \displaystyle \sum_{i<j}^n(y_i-y_j)^2

拆开 发现x,yx,y相互独立 我们只研究xx的部分yy部分同理

i<jn(xixj)2=i<jn(xi2+xj22xixj)\displaystyle \sum_{i<j}^n(x_i-x_j)^2=\sum_{i<j}^n(x_i^2+x_j^2-2x_ix_j)

分析

  • 对于前两项平方和 i<jn(xi2+xj2)=in(n1)xi2\displaystyle \sum_{i<j}^n(x_i^2+x_j^2)=\displaystyle \sum_i^n(n-1)x_i^2

因为是求每两个数的距离和,那么对于任意一项xix_i需要和其他n1n-1项进行配对

xi2x_i^2在一组配对计算中有且仅有一个,则对于n1n-1的配对中xi2x_i^2会被加上n1n-1

也就是说任意的xi2x_i^2都会出现且仅出现n1n-1次,即i<jn(xi2+xj2)=in(n1)xi2\displaystyle \sum_{i<j}^n(x_i^2+x_j^2)=\displaystyle \sum_i^n(n-1)x_i^2

  • 对于最后一项 i<jn2xixj=(inxi)2inxi2\displaystyle \sum_{i<j}^n 2x_ix_j={(\displaystyle \sum_i^nx_i)}^2-\displaystyle \sum_i^nx_i^2

i<jn2xixj=i<jn(xixj+xjxi)=i,jnxixj\displaystyle \sum_{i<j}^n2x_ix_j=\displaystyle \sum_{i<j}^n(x_ix_j+x_jx_i)=\displaystyle \sum_{i,j}^nx_ix_j

不考虑顺序的话任意的配对了 无论是xixjx_ix_j还是xjxix_jx_i都会被计算一次

i,jnxixj=(x1+x2++xn)2x12x22xn2=(inxi)2inxi2\displaystyle \sum_{i,j}^nx_ix_j=(x_1+x_2+\dots+x_n)^2-x_1^2-x_2^2-\cdots x_n^2={(\displaystyle \sum_i^nx_i)}^2-\displaystyle \sum_i^nx_i^2

将上述平方拆开就可以得到答案

别忘了这是2xiyi2x_iy_i后面计算别忘了负号

结果

i<jn(xixj)2=in(n1)xi2[(inxi)2inxi2]=ninxi2+(inxi)2\displaystyle \sum_{i<j}^n(x_i-x_j)^2=\displaystyle \sum_i^n(n-1)x_i^2-\bigg[{(\displaystyle \sum_i^nx_i)}^2-\displaystyle \sum_i^nx_i^2\bigg]=n \displaystyle \sum_i^nx_i^2+{(\displaystyle \sum_i^nx_i)}^2

同理

i<jn(yiyj)2=in(n1)yi2[(inyi)2inyi2]=ninyi2+(inyi)2\displaystyle \sum_{i<j}^n(y_i-y_j)^2=\displaystyle \sum_i^n(n-1)y_i^2-\bigg[{(\displaystyle \sum_i^ny_i)}^2-\displaystyle \sum_i^ny_i^2\bigg]=n \displaystyle \sum_i^ny_i^2+{(\displaystyle \sum_i^ny_i)}^2

总结

将上诉两者相加
i<jn[(xixj)2+(yiyj)2]=nin(xi2+yi2)(inxi)2(inyi)2\displaystyle \sum_{i<j}^n[(x_i-x_j)^2+(y_i-y_j)^2]=n\displaystyle \sum_i^n(x_i^2+y_i^2)-{(\displaystyle \sum_i^nx_i)}^2-{(\displaystyle \sum_i^ny_i)}^2

代码

代码中只需要三个变量

s各个横纵坐标的平方和

sx横坐标的和

sy纵坐标的和

注意数据很大要开Long Long

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
typedef long long LL;
int n,x,y;
LL s,sx,sy;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
s+=x*x+y*y;
sx+=x,sy+=y;
}
cout<<n*s-sx*sx-sy*sy<<endl;
return 0;
}