AcWing 789. 数的范围
原题链接
简单
作者:
blalalt
,
2020-05-02 10:22:37
,
所有人可见
,
阅读 911
C++ 代码
#include <iostream>
using namespace std;
#define N 100010
int arr[N];
int find_left(int arr[], int n, int k) {
int l = 0, r = n - 1;
while (l < r) {
int 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;
while (l < r) {
int 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;
}
}