P1296 奶牛的耳语
二分问题
思路
每个牛的交流距离d是一样的,所以只要距离在d内就可以交流,要求可以交流的对数只要先按照坐标的大小排序好,然后找到遍历找到当前牛可以交流的数量加到ans就行了
用二分查找找到第一个大于a[i] + d的坐标j,此时i+1,i+2······,j-1都是可以与i交流
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, d, a[N], idx;
long long int ans;
int Binary(int l, int r)
{
int mid;
while (l < r)
{
mid = (l + r) / 2;
if (a[mid] > idx) r = mid;
else l = mid + 1;
}
return l;
}
int main()
{
cin >> n >> d;
for (int i = 0; i < n; i ++ ) cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n - 1; i ++ )
{
idx = a[i] + d;
ans += Binary(i, n) - i - 1;
/*
// 找到第一个超过a[i]+d的位置
int j = upper_bound(a + i, a + n, a[i] + d) - a;
// 可以交流的对数是j-i-1
ans += j - i - 1;
*/
}
cout << ans << endl;
return 0;
}