洛谷T778641 模拟赛1 T1 评估(assess)
T778641 模拟赛1 T1 评估(assess)
题目描述
小明同学是一家科技公司数据分析部门的员工。一天,他获取到了一组长度为 \(n\) 的整数数列 \(a_i\),这个数列代表着每个时间段产品的性能数据。为了更深入地了解产品性能的波动情况,他需要计算 \(\sum_{i=1}^{n-1} \sum_{j=i+1}^n |a_i - a_j|^2\) 来评估整体的差异程度(数列从 \(1\) 开始编号)。
但小明同学并不想去计算,于是他想请你帮忙。
输入格式
输入的第一行包含一个正整数 \(n\),表示数列的长度。
输入的第二行包含 \(n\) 个整数 \(a_i\),表示每个时间段产品的性能数据。
输出格式
输出共一行,包含一个整数,表示数列整体的差异程度。
输入输出样例 #1
输入 #1
3
2 8 4
输出 #1
56
输入输出样例 #2
输入 #2
5
-5 8 9 -4 -3
输出 #2
950
说明/提示
样例 1 解释
\(|2-8|^2 + |2-4|^2 + |8-4|^2 = 36 + 4 + 16 = 56\)。
数据规模与约定
- 对于 \(40\%\) 的数据,保证 \(n \le 1000,|a_i| \le 10\)。
- 对于 \(100\%\) 的数据,保证 \(n \le 1 \times 10^5,|a_i| \le 1000\)。
这是我的模拟赛满分的题目
首先很多人看到这题心想:这么简单的枚举?
就直接双重循环打暴力结果发现:
有一半过不了??
我就是这么过来的
这题难度不大,但是很坑,我们要用O(n)的法子过掉
让我们从给的式子入手:
\(\sum_{i=1}^{n-1} \sum_{j=i+1}^n |a_i - a_j|^2\)
展开平方:
\((a_i - a_j)^2=a_i^2-2a_ia_j+a_j^2\)
全部配对推导我们可以得到:
\(\sum_{i<j}^{} (a_i - a_j)^2=1/2 [n \sum_{}^{} a_i^2-(\sum_{}^{} a_i)^2]\)
推出这个式子代码就出来了
ACcode:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n;
long long a[N];
long long ans;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
long long sum=0,s=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
s+=a[i]*a[i];
}
ans=(1ll*n*s-sum*sum); //完美的优化O(n)!
cout<<ans<<endl;
return 0;
}
//Author:AAA_jiancaipifa

浙公网安备 33010602011771号