方法1:用map容器映射
这一题将A-B=C转换成A-C=B,首先将A数组每个元素出现的次数统计起来,用map映射,最后将A数组每次减一个C,再将A数组扫一遍,将所有映射的次数和加起来就是答案
#include<bits/stdc++.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n,c,a[200005];
map<int,int> m;
int ans=0;
int main()
{
cin>>n>>c;
for(int i=0;i<n;i++)
{
cin>>a[i];
m[a[i]]++;
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
ans+=m[a[i]+c];
}
cout<<ans;
}
用STL中的lower_bound/upper_bound函数
注意:
lower_bound(a,a+n,x)-a //下标从0开始
lower_bound(a+1,a+n+1,x)-a //下标从1开始
它们就能取得最小的a数组的下标i,满足ai⩾x。即为x的第一个数的下标
upper_bound(a,a+n,x)-a //下标从0开始
upper_bound(a+1,a+n+1,x)-a //下标从1开始
它们就能取得最小的aa数组的下标ii,满足ai > x。即为大于x的第一个数的下标
即upper与lower的差即为数组中数值为A+CA+C的元素个数。将这个数加到ans中。
#include<bits/stdc++.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n,c,a[200005];
int ans=0;
int main()
{
cin>>n>>c;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
ans+=upper_bound(a,a+n,a[i]+c)-lower_bound(a,a+n,a[i]+c);
}
cout<<ans;
}