注意到 n ≤ 1e6
而 a[i] ≤ 1000
,可以看到 a[i]
范围很小,或者说极限数据下会有大量重复的值出现,我们想想怎么利用这一点:记 cnt[]
表示i出现的次数,枚举 (i, j)
对(共 1e6
种)。
不同情况直接相乘,特殊处理相同情况。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+10, M = 1010;
int n;
int a[N];
int cnt[M];
signed main()
{
cin>>n;
for(int i=1; i<=n; ++i)
{
scanf("%d", &a[i]);
++cnt[a[i]];
}
int ans = 0;
for(int i=0; i<=1000; ++i)
{
for(int j=i; j<=1000; ++j)
{
int add;
if(i==j) add = (cnt[i] + cnt[i] * (cnt[i]-1) / 2);
else add = cnt[i] * cnt[j];
ans = ans + add * abs(i + j - 1000);
}
}
printf("%lld\n", ans);
return 0;
}