二分

#include <iostream>
using namespace std;
const int N = 1e5+5;
int a[N];

// @return [l,r) 中 第一个大于等于 x 的值的下标  (a[N] 升序) 
int lower_bound(int l, int r, int x) { 
    while (l < r) {
        int mid = (l+r)>>1;
        if (a[mid] >= x) r = mid;
        else l = mid+1;
    }
    return l; // if l == r(传入) 则cannot find the result 
}

// @return [l,r) 中 第一个大于 x 的值的下标   (a[N] 升序)
int upper_bound(int l, int r, int x) {
    while (l < r) {
        int mid = (l+r)>>1;
        if (a[mid] > x) r = mid;
        else l = mid+1;
    }
    return l; // if l == r(传入) 则 cannot find the result 
} 

// 上述两例 可以 应用 最小化最大值   升序  左闭右开 


// 下述两例 可以 应用 最大化最小值   降序  左开右闭 

// @return (l,r] 中 最后一个小于等于 x 的值的下标  (a[N] 升序) 
int last_less_equal(int l, int r, int x) {
    while (l < r) {
        int mid = (l+r+1)>>1;
        if (a[mid] <= x) l = mid;
        else r = mid-1;
    }
    return l; // if l == l(传入)  则 cannot find the result 
}

// @return (l,r] 中 最后一个小于等于 x 的值的下标 (a[N] 升序) 
int last_less(int l, int r, int x) {
    while (l < r) {
        int mid = (l+r+1)>>1;
        if (a[mid] < x) l = mid;
        else r = mid-1;
    }
    return l; // if l == l (传入) 则 cannnot find the result 
} 


int main() {
    int k = 1;
    for (int i=0; i<=4; i++) {
        a[i] = k++;
    }
    cout << upper_bound(0, 5, 5) << endl;  // 左闭右开 
    cout << last_less_equal(-1, 4, 1) << endl; // 左开右闭 
    return 0;
}

 

posted @ 2022-03-20 15:18  jianping5  阅读(42)  评论(0)    收藏  举报