P1102 A−B数对
刷普及-打基础系列。。。
我的第一思路是把这个数组排序并去重,顺便算出去重后的每个数字在原数字中出现多少次。
发现我不会做。。。
然后其实可以有另一种做法:
把这些值扔进一个map里面,统计每个值出现的次数。
然后还是排序去重,在数组中挑出唯一的一个\(B\),在map中找出\(A\)和\(B\)出现的次数。所有的这些相乘得到的结果相加就是答案。
附上我感触很深的一句话:开不了的数组,用map!!!
没错呢!map还可以开负数下标的。除了速度有点小慢之外没什么大问题。
其实也不慢的。
代码:
#include<cstdio>
#include<algorithm>
#include<map>
const int maxn = 200005;
int a[maxn];
std::map<int,long long> mmp;
int n, c;
int main()
{
scanf("%d%d", &n, &c);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
mmp[a[i]] = mmp[a[i]] + 1;
}
std::sort(a + 1, a + n + 1);
int len = std::unique(a + 1, a + n + 1) - a - 1;
long long ans = 0;
for(int i = 1; i <= len; i++)
{
ans += mmp[a[i]] * mmp[a[i] + c];
}
printf("%lld\n", ans);
return 0;
}