题目的数据范围 n很大,而ai很小,如果用ai来枚举的话,ai^2 只有10^6,符合要求
可以先用桶装载每个ai的数量,然后再利用组合数学进行枚举
首先,为什么可以用桶,证明:
=
++...
可以发现 对于两个任意的 ai aj 被选中作为一对当且仅当只有一次
发现规律 每一对i,j都当且仅当被匹配一次
所以 对于 0<=i<=1000 i<=j<=1000
- 对于i==j
- 对于i!=j
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e6+10,M=1010;
int a[N];
int cnt[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a;cin>>a;
cnt[a]++;
}
long long res=0;
for(int i=0;i<=1000;i++)
for(int j=i;j<=1000;j++)
{
if(i==j) res+=1ll*abs(i+i-1000)*(cnt[i]+cnt[i]*(cnt[i]-1ll)/2ll);
else res+=1ll*abs(i+j-1000)*cnt[i]*cnt[j];
}
cout<<res;
return 0;
}