[洛谷]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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值