题目大意
给出一串数以及一个数字C,要求计算出所有A−B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)
所有输入数据都在longint范围内。
对于100%的数据,N≤200000。
题目解析
简单思路:暴力枚举
数据规模都在longint范围,且N最大为200000,会爆
所以用哈希表来解决这个问题
A-B=C 经过移项后得 A=B+C
也就是说是 一个数=另一个数+C
判断这个数是否在哈希表内
ans要加上这两个数出现的次数的乘积
代码
#include<bits/stdc++.h>
#define h(x) x%p
#define p 1000007//质数
#define LL long long
using namespace std;
LL n,c,x,ans,b[p];
LL a[p+5][2];
//a[x][0] 记录哈希函数值为x的S值,a[x][2] 记录这个 S 值出现了几次
int loc(LL x)
{
int k=h(x),i=0;
while(a[(k+i)%p][0]!=0&&a[(k+i)%p][0]!=x)
i++;
return (k+i)%p;
}//查找关键字在哈希表的位置
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>x;
b[i]=x;
int t=loc(x);
a[t][0]=x;
a[t][1]++;//次数+1
}
for(int i=0;i<=p;i++)
{
if(a[i][1]>0)
{
int t=loc(a[i][0]+c);//求另一个数的值
ans+=a[i][1]*a[t][1];//出现次数的乘积
}
}
cout<<ans;
}