1 条题解

  • 0
    @ 2026-1-27 19:41:51
    #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
    上传者