![](https://i-blog.csdnimg.cn/direct/63d62b3b6dde4b8ebbc3b72adf7f8cf2.png)
![](https://i-blog.csdnimg.cn/direct/b2e176dd1fea45bf91225d2557b054b7.png)
![](https://i-blog.csdnimg.cn/direct/9bce94f1d6434b95a5724256fefa9279.png)
这道题就是一道简单的模板题,我们分析一下!,首先我们要找大于等于x的起始位置
![](https://i-blog.csdnimg.cn/direct/9a14b7e9e7a34333aa90f919e60db108.png)
我们还是用两个指针,left指向1,right指向n,如果a[mid]<x left = mid+1
如果a[mid]>=x 就让right= mid
如果数组全是小于x的话,x = 3 ,[0 , 1 , 2] 我们最后就会指向2,2还是小于x的,所以我们这个数组大于等于x的值不存在,返回0
接下来我们找一下小于等于y的终止位置
![](https://i-blog.csdnimg.cn/direct/8934eb4525ff4e5f8ecf8d184b37ceaa.png)
如果a[mid]大于y,right=mid-1,
如果a[mid]小于等于y,left=mid+1
我们还需要考虑一下最后结果可能是大于y的情况,比如y是3,数组是[4,5,6]的话,结果是4,4还是大于3的,根本就找不到小于等于3的区间,所以返回0
好的,话不多说我们写一下代码
cpp
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int binary_search(int x1, int x2)
{
int left = 1, right = n;
while (left < right)
{
int mid = (left + right) / 2;
if (a[mid] >= x1) right = mid;
else left = mid + 1;
}
if (a[left] < x1) return 0;
int tmp = left;
left = 1, right = n;
while (left < right)
{
int mid = (left + right + 1) / 2;
if (a[mid] <= x2) left = mid;
else right = mid - 1;
}
if(a[left]>x2) return 0;
return left - tmp + 1;
}
int x, y;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int q; cin >> q;
while (q--)
{
cin >> x >> y;
cout << binary_search(x, y) << endl;
}
}