标准答案
这一题将A-B=C转换成A-C=B,首先将A数组每个元素出现的次数统计起来,用map映射,最后将A数组每次减一个C,再将A数组扫一遍,将所有映射的次数和加起来就是答案
#include <bits/stdc++.h>
using namespace std;
int a[200010];
int main(){
int n , c;
cin >> n >> c;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
sort(a+1, a+n+1);
int l = 1;
int r = 1;
long long sum = 0;
for(int i = 1; i <= n; i++){
int t = a[i] + c;
while(l <= n && a[l] < t) l++;
while(r <= n && a[r] <= t) r++;
if(a[l] == t && a[r-1] == t) sum += r-l;
}
cout << sum;
return 0;
}
我的答案
#include<stdio.h>
#include<math.h>
int a[200005];
int n, c;
int cmp_int(const void* e1, const void* e2) {
return *(int*)e1 - *(int*)e2;
}
int main() {
int numC;
long long ans = 0;
scanf("%d %d", &n, &c);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
qsort(a + 1, n, sizeof(a[1]), cmp_int);
int l=1,r=1;
for(int i=1;i<=n;i++){
numC=a[i]+c;
while(l<=n&&a[l]<numC)l++;//把左指针移到这个区间的最左边
while(r<=n&&a[r]<=numC)r++;//把右指针移到这个区间的最右边+1
ans+=r-l;
}
printf("%lld\n",ans);
return 0;
}