SCL--二分与lower_bound / upper_bound

2016-07-13 19:20:06

使用手写二分实现lower_bound与upper_bound:

lower_bound: 第一个 >= v 的位置。

upper_bound: 第一个 > v 的位置。

lower_bound:

int l = 1,r = n,ans;
    while(l < r){
        int mid = getmid(l,r);
        if(A[mid] < v) l = mid + 1;
        else r = mid;
    }
    ans = l;

 

upper_bound:

写法1:

int l = 1,r = n,ans;
    while(l <= r){
        int mid = getmid(l,r);
        if(A[mid] <= v) l = mid + 1;
        else r = mid - 1;
    }
    ans = l;

写法2:

int l = 1,r = n,ans;
    while(l < r){
        int mid = getmid(l,r);
        if(A[mid] <= v) l = mid + 1;
        else r = mid;
    }
    if(A[l] <= v) l++;
    ans = l;

 

posted @ 2016-07-13 19:38  Naturain  阅读(412)  评论(0编辑  收藏  举报