AcWing_789 数的范围(二分、模板)

AcWing

789. 数的范围

两个二分函数:

ll(int k):寻找不严格单调递增数组中,值为k的最左边的位置;

rr(int k):寻找不严格单调递增数组中,值为k的最右边的位置。

#include <bits/stdc++.h>
using namespace std;
int n, q;
const int N = 100010;
int a[N];
int ll(int k){
    int l = 0, r = n - 1;
    while(l < r){
        int mid = l + r >> 1;
        if(a[mid] >= k) r = mid;
        else l = mid + 1;
    }
    if(a[r] != k) r = -1;
    return r;
}
int rr(int k){
    int l = 0, r = n - 1;
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(a[mid] <= k) l = mid;
        else r = mid - 1;
    }
    if(a[r] != k) r = -1;
    return r;
}
int main(){
    cin >> n >> q;
    for(int i = 0; i <= n - 1; i++) cin >> a[i];
    while(q--){
        int k;
        cin >> k;
        cout << ll(k) << ' ' << rr(k) << endl;
    }
    return 0;
}