AcWing 789. 数的范围
原题链接
简单
作者:
blalalt
,
2020-05-01 09:43:37
,
所有人可见
,
阅读 650
#include <iostream>
using namespace std;
#define N 100010
#define M 10010
int arr[N];
int find_left(int arr[], int n, int k) {
int l = 0, r = n-1;
int mid;
while (l < r) {
mid = (l+r) >> 1;
if (arr[mid] >= k) r = mid; // 不断的往左边方向
else l = mid + 1;
}
if (arr[l] != k) return -1;
else return l;
}
int find_right(int arr[], int n, int k) {
int l = 0, r = n-1;
int mid;
while (l < r) { // 如果序列中存在k的话,必然是 l==r,arr[l]==k,右边界
mid = (l+r+1) >> 1;
if (arr[mid] <= k) l = mid; // 不断的往右边方向
else r = mid - 1;
}
if (arr[l] != k) return -1;
else return l;
}
int main() {
// 使用二分法,分别查找该值左右边界
int n, q;
cin >> n >> q;
for(int i=0; i<n; i++) cin >> arr[i];
int k;
while (q--) {
cin >> k;
cout << find_left(arr, n, k) << " " << find_right(arr, n, k) << endl;
}
}