题目描述
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入
输入共两行。
第一行,两个正整数 N,C。
第二行,N个正整数,作为要求处理的那串数。
输出
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
样例输入 复制
4 1
1 1 2 3
样例输出 复制
3
提示
1≤N≤2×10^5,0≤ai<2^30,1≤C<2^30。
题解:
#include<stdio.h>
#include<math.h>
int a[200005];
int n, c;
int findlen1(int x) {
int l=1,r=n;
while (l <= r) {
int mid = (l + r) / 2;
if (a[mid] <x) {
l = mid + 1;
} else {
r = mid - 1;
}
}
if(a[l]==x)return l;
else return 0;
}
int findlen2(int x) {
int l=1,r=n;
while (l <= r) {
int mid = (l + r) / 2;
if (a[mid] <=x) {
l = mid + 1;
} else {
r = mid - 1;
}
}
if(a[r]==x)return r;
else return -1;
}
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);
for (int i = 1; i <= n; i++) {
numC = a[i] + c;
ans += (findlen2(numC)-findlen1(numC))+1;
}
printf("%lld\n", ans);
}