@[songwu_el](/user/822337) 用下标数据太大肯定会re,可以用哈希或者二分
------------
```cpp
#define maxn 200010
#define ll long long
int a[maxn],b[maxn];
int n,c;
ll ans;
//二分
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]+c;
}
sort(b+1,b+n+1);
/*
lower_bound():返回大于或等于目标值的第一个位置
upper_bound():返回大于目标值的第一个位置
*/
for(int i=1;i<=n;i++)
{
int x=a[i];
int l=lower_bound(b+1,b+n+1,x)-b;
int r=upper_bound(b+1,b+n+1,x)-b;
if(l!=r) ans+=r-l;
}
printf("%lld\n",ans);
return 0;
}
//哈希
unordered_map<int,int> T;
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
T[a[i]]++;
}
for(int i=1;i<=n;i++)
{
ll x=a[i]-c;
if(T.count(x)) ans+=T[x];
}
printf("%lld\n",ans);
return 0;
}
```
by acheve_1k @ 2023-08-26 10:54:08
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e5;
int a[N+5];
int n;
int find1(int num,int id){
int left=id+1,right=n;
while(left<=right){
int mid=(left+right)/2;
if(a[mid]>=num){
right=mid-1;
}
else if(a[mid]<num){
left=mid+1;
}
}
return a[left]==num?left:0;
}
int find2(int num,int id){
int left=id+1,right=n;
while(left<=right){
int mid=(left+right)/2;
if(a[mid]>num){
right=mid-1;
}
else{
left=mid+1;
}
}
return a[right]==num?right:0;
}
int main(){
int C;
cin>>n>>C;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int A,B;
long long sum=0;
for(int i=1;i<=n-1;i++){
B=a[i];
A=B+C;
int sum1=find1(A,i);
int sum2=find2(A,i);
if(sum1!=0&&sum2!=0)
sum+=sum2-sum1+1;
}
cout<<sum;
return 0;
}
```
by Yang_Yihang @ 2023-08-26 21:38:35
@[Yang_Yihang](/user/1012425) @[acheve_1k](/user/1050664)
谢谢两位大佬
by songwu_el @ 2023-08-27 09:32:11