AcWing 789. 数的范围
原题链接
简单
作者:
羊妞
,
2025-04-15 11:17:31
· 江苏
,
所有人可见
,
阅读 1
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, q;
int a[N];
int main(){
scanf("%d%d", &n, &q);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
while(q--){
int x;
scanf("%d", &x);
//确定边界。目标:要找到元素x的范围[i,j]
int l = 0, r = n - 1;
int i, j;
/*
先找满足x的最左边的坐标i
最左边的坐标位置i满足:右边的值都>=x,左边的都<x。所以check函数可将区间分为>=x和<x
*/
while(l < r){
int mid = l + r >> 1;//最后考虑补1
if(a[mid] >= x) r = mid;
else l = mid + 1;//因为不是l=mid,所以不需要补1
//判断无解的情况,最后的区间变为l=r,只有一个元素,这个元素是i
}
if(a[l] != x) cout << "-1 -1" << endl;
else{
i = l;//找到左边界,再找右边界j
r = n - 1; //省略l的更新,l=i
while(l < r){
//最后的右边界j满足,左边的值都<=x,右边的都>x。所以check函数可将区间分为<=x和>x
//由此得出区间的划分需要以最终的答案为标准
int mid = l + r + 1 >> 1;//后考虑是否补1
if(a[mid] <= x) l = mid;//需要补
else r = mid - 1;
}
j = r;
cout << i << " " << j << endl;
}
}
return 0;
}