[洛谷]P1102 A−B数对

题目大意

给出一串数以及一个数字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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/85393467