P1296 奶牛的耳语

二分问题

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;
}
posted @ 2025-07-31 16:45  Roin_Long  阅读(4)  评论(0)    收藏  举报