【数学式子推导】梦熊[csp-noip十连测第六套] T2 距离

感谢 Jayun 的技术支持

原题式子
∑ i = 1 n ∑ j = i + 1 n ( ( x i − x j ) 2 + ( y i − y j ) 2 ) \sum_{i=1}^{n}\sum_{j=i+1}^{n}{((x_i-x_j)^2+(y_i-y_j)^2)} i=1nj=i+1n((xixj)2+(yiyj)2)
先只考虑 x x x
∑ i = 1 n ∑ j = i + 1 n ( x i − x j ) 2 \sum_{i=1}^{n}\sum_{j=i+1}^{n}{(x_i-x_j)^2} i=1nj=i+1n(xixj)2
化简:
  ∑ i = 1 n ∑ j = i + 1 n ( x i − x j ) 2 = ∑ i = 1 n ∑ j = i + 1 n ( x i 2 + x j 2 − 2 x i x j ) = ∑ i = 1 n ( ( n − i ) x i 2 + ∑ j = i + 1 n ( x j 2 − 2 x i x j ) ) = ∑ i = 1 n ( ( n − i ) x i 2 + ( i − 1 ) [ 1 ] x i 2 − 2 ∑ j = i + 1 n x i x j ) = ∑ i = 1 n ( ( n − 1 ) x i 2 − 2 x i ∑ j = i + 1 n x j ) \begin{align} &\quad~ \sum_{i=1}^{n}\sum_{j=i+1}^{n}{(x_i-x_j)^2}\\ &=\sum_{i=1}^{n}\sum_{j=i+1}^{n}{(x_i^2+x_j^2-2x_ix_j)}\\ &=\sum_{i=1}^{n}{\left((n-i)x_i^2+\sum_{j=i+1}^{n}{(x_j^2-2x_ix_j)}\right)}\\ &=\sum_{i=1}^{n}{\left((n-i)x_i^2+(i-1)^{\color{Red}{\tiny [1]}}x_i^2-2\sum_{j=i+1}^{n}{x_ix_j}\right)}\\ &=\sum_{i=1}^{n}{\left((n-1)x_i^2-2x_i\sum_{j=i+1}^{n}{x_j}\right)}\\ \end{align}  i=1nj=i+1n(xixj)2=i=1nj=i+1n(xi2+xj22xixj)=i=1n((ni)xi2+j=i+1n(xj22xixj))=i=1n((ni)xi2+(i1)[1]xi22j=i+1nxixj)=i=1n((n1)xi22xij=i+1nxj)

( 4 ) [ 1 ] : i < j (4){\color{Red}[1]} : i<j (4)[1]:i<j 时,每个 i i i 计算都加一遍 x j 2 x_j^2 xj2,总共加 i − 1 i-1 i1 次。

用前缀和处理后面一个 sigma 即可,即
∑ i = 1 n ( ( n − 1 ) x i 2 − 2 x i ( s u m x n − s u m x i ) ) \sum_{i=1}^{n}{\left((n-1)x_i^2-2x_i(sum_{x_n}-sum_{x_i})\right)} i=1n((n1)xi22xi(sumxnsumxi))

y y y 同理,复杂度 O ( n ) O(n) O(n)

__int128,附带读写。

#include<bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
ll n;
__int128 x[100002],y[100002],h[100002],ns,ans;
inline ll rd()
{
	ll rt=0;int fs=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') fs=-1;c=getchar();}
	while('0'<=c&&c<='9') {rt=rt*10-48+c;c=getchar();}
	return rt*fs;
}
void print(__int128 pt)
{
	if(pt<0)
	{
		putchar('-');
		pt=-pt;
	}
	if(pt>9) print(pt/10);
	putchar(char(pt%10+48));
}
int main()
{
//	freopen("dis.in","r",stdin);
//	freopen("dis.out","w",stdout);
	n=rd();
	for(int i=1;i<=n;++i)
	{
		x[i]=rd(),y[i]=rd();
		h[i]=x[i]+h[i-1];
	}
	ns=h[n];
	for(int i=1;i<=n;++i)
		ans+=(n-1)*x[i]*x[i]-2*x[i]*(ns-h[i]);
	for(int i=1;i<=n;++i)
		h[i]=y[i]+h[i-1];
	ns=h[n];
	for(int i=1;i<=n;++i)
		ans+=(n-1)*y[i]*y[i]-2*y[i]*(ns-h[i]);
	print(ans);
	return 0;//freopen?
}
/*
*/
//-static-libgcc -std=c++14 -Wall -Wl,--stack=134217728
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CSP-S222是一个自测系统,它的主要目的是帮助用户评估和测试自己的计算机科学知识和能力。这个系统由中国计算机学会(CSP)开发,并且针对计算机科学相关的专业课程。 CSP-S222自测系统提供了一系列的问题和题目,涵盖了计算机科学的各个方面,例如算法、数据结构、编程语言、操作系统、数据库等。用户可以通过回答这些问题进行自我评估,了解自己在这些方面的水平和能力。 使用CSP-S222进行自测非常简单。用户可以通过注册并登录系统,然后选择相应的题目进行回答。这些题目既有选择题,也有编程题。用户可以根据自己的实际情况,选择合适的题目进行回答。在回答问题的过程中,系统会根据用户的答案自动评分,并提供相应的反馈和解析,帮助用户检查和纠正错误。 CSP-S222自测系统的好处是帮助用户系统地了解自己在计算机科学方面的知识和能力。通过自测,用户可以发现自己的薄弱环节,并针对性地进行学习和提高。此外,CSP-S222还提供了一些参考资料和学习资源,帮助用户进一步深入学习和掌握计算机科学相关的知识。 总之,CSP-S222自测系统是一个方便、实用的工具,可以帮助用户评估和测试自己在计算机科学方面的知识和能力。通过自测,用户可以更好地了解自己的水平,并进行针对性的学习和提高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值