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;
}
posted @ 2018-10-12 21:57  Garen-Wang  阅读(146)  评论(0编辑  收藏  举报