题目描述

给出一串数以及一个数字
C,要求计算出所有 A B = C A−B=C AB=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个整数 N,C。
第二行,N 个整数,作为要求处理的那串数。
输出格式
一行,表示该串数中包含的满足 A B = C A−B=C AB=C 的数对的个数。

4 1
1 1 2 3
3

很简单的一道题,要注意的是映射的思想
利用二分,一遍循环枚举找BB,中间二分找C,时间复杂度O(nlogn),本题也可以利用stl中自带的红黑树map达到ACAC的效果

#include<string.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<double,ll>pdl;
#define debug(x) cerr<<"# "<<x<<endl
const ll N=2e5+7;
const ll base=137;
const ll mod=2147483647;
const int INF = 1<<30;
ll n,m,a[N],b,c,ans;
unordered_map<ll,ll>mp;
int main()
{
    scanf("%lld %lld",&n,&c);
    for(int i=1;i<=n;++i)
    {
        scanf("%lld",&a[i]);
        mp[a[i]]++;
    }
    for(int i=1;i<=n;++i)
    {
        ans+=mp[a[i]-c];
    }
    printf("%lld\n",ans);
}