一个二分查找的基本题,不同的是需要寻找范围。那么就是要找第一个符合的最小的数,最后一个符合的最大的数。这样可以通过返回下标直接相减加一得到数量。在寻找最大的数的最大下标的时候需要mid = (l+r+1)/2。因为如果相等会让l = mid。但(l+r)/2会偏向于l处。在相邻的时候会出现不变的情况导致死循环。
细节:需要判断是否与题中所给区间有无交际,如果没有的话直接输出0,否则再使用查找函数去查找的话会找到第一位和最后一位停止的,返回的结果不对。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int a[maxn]; int n; int find_min(int x) { int l = 1, r = n; int mid; while (l<r) { mid = (l+r)/2; if (a[mid]>=x) r = mid; else l = mid+1; } return l; } int find_max(int x) { int l = 1, r = n; int mid; while (l<r) { mid = (l+r+1)/2; if (a[mid]<=x) l = mid; else r = mid-1; } return l; } int main() { cin>>n; for (int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1, a+n+1); int q; int x, y; cin>>q; while (q--) { scanf("%d %d", &x, &y); if (x>a[n]||y<a[1]) { printf("0\n"); continue; } int begin = find_min(x); int end = find_max(y); // if (min_flag==0&&max_flag==0) { // printf("0\n"); // continue; // } printf("%d\n", end-begin+1); } return 0; }