整数二分 注意边界问题
为了避免死循环
l = mid 时 mid = l + r + 1 >> 1; //因为在c/c++ 里面是向下取整
同理
r = mid 时 mid = l + r >> 1;
下面直接给出了本题的题解
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, q, k, a[N];
int main ()
{
scanf("%d %d", &n, &q);
for(int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
}
while(q -- )
{
scanf("%d", &k);
int l = 0, r = n - 1, mid;
while(l < r)
{
mid = l + r >> 1;
if(k <= a[mid]) r = mid;
else l = mid + 1;
}
if(a[l] != k) cout << "-1 -1" << endl;
else
{
cout << l << " ";
l = 0, r = n - 1;
while(l < r)
{
mid = l + r + 1 >> 1;
if(a[mid] <= k) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}