AcWing 789. 数的范围
原题链接
简单
作者:
牛奶小柒Luke
,
2021-03-21 17:16:01
,
所有人可见
,
阅读 348
整数二分
找一个区间[l,r],使得答案一定在该区间中
找到一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点。找左端点时q[mid]>=x;找右端点时,q[mid]<=x
分析终点m在该判断条件下是否成立,如果成立,考虑答案在哪个区间;如果不成立,考虑答案在哪个区间。q[mid]>=x时,右区间都成立,答案在左区间内,故r = mid;q[mid]<=x时,左区间都成立,答案在右区间内,故l = mid
如果更新方式写的是r = mid,则不用做任何处理;如果更新方式写的是l = mid,则需要在计算mid时加上1
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int n,m;
int q[N];
int main(){
scanf("%d%d",&n,&m);
for(int i = 0;i < n;++i) scanf("%d",&q[i]);
for(int i = 0;i < m;++i){
int x;
scanf("%d",&x);
int l = 0,r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(q[mid] >= x) r = mid;
else l = mid + 1;
}
if(q[r] == x){
cout << r << ' ';
r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}else{
printf("-1 -1\n");
}
}
return 0;
}