这道题我写了好几遍,第三个数据总是出错,心态崩了。我用的是自己写的函数,应该和upperbound和lowerbound差不多,但是就是不太行。大佬的题解用的map和哈希函数我是啥也看不懂。只好求救大家。
#include<bits/stdc++.h>
using namespace std;
const int Max = 2e5 + 10;
int recording[Max];
int ub(int i, int n);
int lb(int i, int n);
int main()
{
int n, c;
int sum = 0;
scanf("%d %d", &n, &c);
for (int i = 0; i < n; i++)
{
scanf("%d", &recording[i]);
}
sort(recording, recording + n);
//for (int i = 0; i < n; i++)
// cout << recording[i] << " ";
//cout << endl;
for (int i = 0; i < n - 1; i++)
{
if((ub(recording[i]+c,n)!=-1) and(lb(recording[i]+c,n)!=-1))
sum += (ub(recording[i]+c, n) - lb(recording[i]+c, n));
/*cout << ub(recording[i]+c, n) << " " << lb(recording[i]+c, n) <<" "<< sum << endl;*/
}
printf("%d", sum);
return 0;
}
int ub(int i, int n)
{
int left = 0, right = n ;
while (left < right)
{
int mid = left + (right - left) / 2;
if (recording[mid] > i)right = mid;
else left = mid + 1;
}
if (recording[right-1] == i)return right;
return -1;
}
int lb(int i, int n)
{
int left = 0, right = n - 1;
while (left < right)
{
int mid = left + (right - left) / 2;
if (recording[mid] < i)left = mid+1;
else right = mid;
}
if (recording[left] == i)return left;
return -1;
}