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

我还在 OI 哦。

感谢 Jayun 的技术支持

原题式子

\[\sum_{i=1}^{n}\sum_{j=i+1}^{n}{((x_i-x_j)^2+(y_i-y_j)^2)} \]

先只考虑 \(x\)

\[\sum_{i=1}^{n}\sum_{j=i+1}^{n}{(x_i-x_j)^2} \]

化简:
\(\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}\)

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

用前缀和处理后面一个 sigma 即可,即

\[\sum_{i=1}^{n}{\left((n-1)x_i^2-2x_i(sum_{x_n}-sum_{x_i})\right)} \]

\(y\) 同理,复杂度 \(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
posted @ 2023-11-15 07:30  BC不才  阅读(46)  评论(0)    收藏  举报