CF76E Points 题解

本文介绍了一道关于计算n个点之间距离平方和的数学问题,原始方法时间复杂度为O(n^2),通过化简公式,将复杂度降低。给出了C++代码实现,包括结构体和优化后的初始化函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给出 n n n 个点的坐标 x x x y y y,让你求出各个点的距离的平方和。

解法

两点距离公式: ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (x1x2)2+(y1y2)2

本题是一道数学题,第一反应是枚举 ∑ i = 1 n ∑ j = i + 1 n ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sum\limits_{i=1}^n \sum\limits_{j=i+1}^n (x_1-x_2)^2+(y_1-y_2)^2 i=1nj=i+1n(x1x2)2+(y1y2)2,时间复杂度为 O ( n 2 ) O(n^2) O(n2)(跑不满),会超时,所以我们要对原式进行化简。

化简得 ( n − 1 ) × ∑ i = 1 n ( x i 2 + y i 2 ) − 2 × ( ∑ i = 1 n − 1 x i × ∑ j = i + 1 n x j + ∑ i = 1 n − 1 y i × ∑ j = i + 1 n y j ) (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) (n1)×i=1n(xi2+yi2)2×(i=1n1xi×j=i+1nxj+i=1n1yi×j=i+1nyj)

代码

#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值