1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n; // [1] n-输入的数列长度 long long arr[100100]; // [2] arr数组-存储输入的性能数据数列(下标从1开始) long long brr[100100]; // [3] brr数组-存储数列的前缀和(brr[i]表示前i个元素的和) int main() { // 问题分析:计算所有i<j的(a_i - a_j)²之和,直接双重循环复杂度O(n²),通过代数展开优化为O(n) // 展开式:(a_i - a_j)² = a_i² - 2a_i a_j + a_j² // 对所有i<j求和,等价于每个a_i²出现(n-1)次,每个交叉项-2a_i a_j出现一次 // 最终转化为:sum = Σ [a_i²*(n-1) - 2a_i*(总和 - 前i项和)] cin>>n; brr[0]=0; // [4] 前缀和初始值:前0个元素的和为0 for(int i=1;i<=n;i++){ cin>>arr[i]; // [5] 读取第i个性能数据 brr[i]=brr[i-1]+arr[i]; // [6] 计算前缀和:前i个元素的和 = 前i-1个元素的和 + 当前元素 } long long sum=0; // [7] sum-存储最终的差异程度总和 for(int i=1;i<=n;i++){ // 计算当前元素arr[i]对总和的贡献: // 1. arr[i]²*(n-1):每个arr[i]与其他n-1个元素配对,平方项出现n-1次 // 2. -2*arr[i]*(brr[n]-brr[i]):arr[i]与后面所有元素的乘积和为arr[i]*(总和 - 前i项和),再乘以-2 sum += (arr[i]*arr[i])*(n-1) - 2*arr[i]*(brr[n]-brr[i]); } cout<<sum; // [8] 输出最终的差异程度 return 0; }
- 1
信息
- ID
- 1378
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者