1. 程式人生 > >P1102 A?B數對

P1102 A?B數對

基礎 can main 速度 max 個數字 統計 ons map

刷普及-打基礎系列。。。

我的第一思路是把這個數組排序並去重,順便算出去重後的每個數字在原數字中出現多少次。

發現我不會做。。。

然後其實可以有另一種做法:

把這些值扔進一個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;
}

P1102 A?B數對