题目大意
给出 nnn 个点的坐标 xxx 和 yyy,让你求出各个点的距离的平方和。
解法
两点距离公式:(x1−x2)2+(y1−y2)2\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}(x1−x2)2+(y1−y2)2。
本题是一道数学题,第一反应是枚举 ∑i=1n∑j=i+1n(x1−x2)2+(y1−y2)2\sum\limits_{i=1}^n \sum\limits_{j=i+1}^n (x_1-x_2)^2+(y_1-y_2)^2i=1∑nj=i+1∑n(x1−x2)2+(y1−y2)2,时间复杂度为 O(n2)O(n^2)O(n2)(跑不满),会超时,所以我们要对原式进行化简。
化简得 (n−1)×∑i=1n(xi2+yi2)−2×(∑i=1n−1xi×∑j=i+1nxj+∑i=1n−1yi×∑j=i+1nyj)(n-1) \times \sum\limits_{i=1}^n (x_i^2 + y_i^2)-2 \times (\sum\limits_{i=1}^{n-1}x_i \times \sum\limits_{j=i+1}^n x_j + \sum\limits_{i=1}^{n-1}y_i \times \sum\limits_{j=i+1}^n y_j)(n−1)×i=1∑n(xi2+yi2)−2×(i=1∑n−1xi×j=i+1∑nxj+i=1∑n−1yi×j=i+1∑nyj)。
代码
#include<bits/stdc++.h>
using namespace std;
long long n,ans1,sum1,sum2,ans2;
struct node
{
int x,y;
node()
{
x=0,y=0;
}
void init1()
{
ans1+=(long long)(x*x*(n-1))+(long long)(y*y*(n-1));
sum1+=x,sum2+=y;
}
void init2(int xx,int yy)
{
ans2+=2*x*sum1+2*y*sum2,sum1-=xx,sum2-=yy;
}
};
node a[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y,a[i].init1();
sum1-=a[1].x,sum2-=a[1].y;
for(int i=1;i<n;i++) a[i].init2(a[i+1].x,a[i+1].y);
cout<<ans1-ans2;
return 0;
}
优化算法:计算n点间距离平方和的高效方法
本文介绍了一道关于计算n个点之间距离平方和的数学问题,原始方法时间复杂度为O(n^2),通过化简公式,将复杂度降低。给出了C++代码实现,包括结构体和优化后的初始化函数。
156

被折叠的 条评论
为什么被折叠?



