这道题找大于等于x1并且小于等于y1的数字个数

我们可以先二分查找大于等于x1的数的最小坐标,然后再二分小于等于x2的最大坐标

然后求区间长度就对了

当然,我们需要注意,比如我们查找大于等于5,我们的数组1,2,3,4 最大只能查找到4,它是不符合要求的,我们直接返回0就行了

同样如果是 7 8 9  10 查找小于等于5的,也只能查到7,也直接返回0

好的,既然如此,我们来写一下代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int a[N];
int binary_search(int x,int y)
{
    int l = 1,r = n;
    while(l<r)
    {
        int mid = (l+r)/2;
        if(a[mid]>=x) r=mid;
        else l = mid+1;
    }
    if(a[l]<x) return 0;
    int tmp = l;
    l=1,r=n;
    while(l<r)
    {
        int mid = (l+r+1)/2;
        if(a[mid]<=y) l=mid;
        else r = mid-1;
    }
    if(a[l] > y) return 0;
    return l-tmp+1;
}
int main()
{
    cin >> n;
    for(int i = 1;i<=n;i++)
    {
        cin >> a[i];
    }
    sort(a+1,a+1+n);
    int q;cin >> q;
    while(q--)
    {
        int x1,x2;cin >> x1 >> x2;
        cout << binary_search(x1,x2) << endl;
    }
    
    
    
    return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐