@[bjqxszx_wangyiheng](/user/1036940) 用桶记录就行了,只不过这一题是map
```cpp
#include<bits/stdc++.h>
using namespace std;
map<int,long long>mp;
int a[200005];
int main(){
int n,c;
scanf("%d%d",&n,&c);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;
}
long long ans=0;
for(int i=0;i<n;i++)ans+=mp[a[i]-c];
printf("%lld\n",ans);
return 0;
}
```
by kevinZ99 @ 2023-11-15 21:36:00
@[kevinZ0221](/user/1117080) dalao 我~~看~~~~不 懂 了~~
by bjqxszx_wangyiheng @ 2023-11-16 16:26:37
@[bjqxszx_wangyiheng](/user/1036940)
这道题可以用二分查找解决 可以先对数组进行排序。
枚举A,问题就是统计B+C出现次数。那么B+c会对应数组连续的一段。
通过二分查找可以找到连续段的左右端点,就可以解决 此问题
代码中用了STL中的lower_bound()和upper_bound() 非常实用,值得学习
代码AC 放心食用
```cpp
#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+10;
int n,c,a[mx];
int main(){
cin>>n>>c;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
long long ans=0;
for(int i=0;i<n;i++){
ans+=upper_bound(a,a+n,a[i]+c)-lower_bound(a,a+n,a[i]+c);
}
printf("%lld",ans);
return 0;
}
```
by taoyize @ 2023-12-12 20:07:42
@[taoyize](/user/1097100) 谢谢dalao
by bjqxszx_wangyiheng @ 2023-12-13 07:25:04