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;