#include<iostream>
#include<algorithm>
using namespace std;
int a[200005], n, c, sum = 0;
void binary_search(int x) {
int l = 0, r = n, mid;
while (l < r) {
mid = l + r >> 1;
if (a[mid] > x)r = mid;
else if (a[mid] < x)l = mid + 1;
else {
sum++;
break;
}
}
int i = mid - 1, j = mid + 1;
while (a[i] == x && i >= 0)i--, sum++;
while (a[j] == x && j < n)j++, sum++;
}
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++)binary_search(a[i] + c);
cout << sum << endl;
return 0;
}
我的思路是这样的,a-b=c,如果直接两重循环时间复杂度n^2爆了,但是将式子变为a=b+c,对b遍历一遍,二分查找数组中有没有b+c这个数值,那么时间复杂度就可以优化到nlogn,理论来说这样没问题,但是提交只有8分。下了个数据,原来是有重复的没有查,所以当二分法查询成功后,再对成功的位置两边进行查询。思路感觉是没错的。但是提交只有84分,第3、4个样例超时,但是感觉已经优化不了了。不知道咋办了求助