题目:题目
题意:求出 ∑ i = 2 N ∑ j = 1 i − 1 ( a i − a j ) 2 \sum_{i=2}^N\sum_{j=1}^{i-1}(a_i-a_j)^2 ∑i=2N∑j=1i−1(ai−aj)2
思路:暴力求解是 O ( n 2 ) O(n^2) O(n2)的时间复杂度,必然TLE,需要对式子进行化简。
∑
i
=
2
N
∑
j
=
1
i
−
1
(
a
i
−
a
j
)
2
\sum_{i=2}^N\sum_{j=1}^{i-1}(a_i-a_j)^2
∑i=2N∑j=1i−1(ai−aj)2
=
(
N
−
1
)
∑
i
=
1
N
a
i
2
−
∑
i
=
2
N
∑
j
=
1
i
−
1
2
a
i
a
j
=(N-1)\sum_{i=1}^{N}a_i^2-\sum_{i=2}^N\sum_{j=1}^{i-1}2a_ia_j
=(N−1)∑i=1Nai2−∑i=2N∑j=1i−12aiaj
=
N
∑
i
=
1
N
a
i
2
−
(
∑
i
=
1
N
a
i
)
2
=N\sum_{i=1}^{N}a_i^2-(\sum_{i=1}^Na_i)^2
=N∑i=1Nai2−(∑i=1Nai)2
如此便可在
O
(
n
)
O(n)
O(n)复杂度下完成任务。
code:
#include <bits/stdc++.h>
using namespace std;
#define mos 300010
#define ll long long
ll n,m;
ll a[mos];
ll flag[mos];
int main()
{
cin>>n;
ll sumaa=0;
ll suma=0;
for (int i=0;i<n;i++)
{
cin>>a[i];
sumaa+=a[i]*a[i];
suma+=a[i];
}
cout<<n*sumaa-suma*suma<<endl;
//system("pause");
return 0;
}
这篇博客探讨了一种数学问题的解决方案,即如何在O(n)的时间复杂度内计算序列中元素平方差的和。通过式子化简,将原本O(n^2)的暴力解法优化到线性时间复杂度,从而避免了超时错误。代码示例展示了如何实现这一优化算法。
1100

被折叠的 条评论
为什么被折叠?



