#include // 需要仔细研究一下lower_bound,upper_bound,还有手动二分的差别,这个细节很重要 // https://www.cnblogs.com/linsinan1995/p/13620590.html using namespace std; const int N = 110; int a[9] = {1, 2, 2, 3, 3, 3, 4, 6, 7}; // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r, int x) { while (l < r) { int mid = (l + r) >> 1; if (a[mid] >= x) r = mid; // check()判断mid是否满足性质 else l = mid + 1; } return l; } // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用: int bsearch_2(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; } int main() { printf("%d\n", lower_bound(a, a + 9, 3) - a); // 3 printf("%d\n", upper_bound(a, a + 9, 3) - a); // 5 printf("%d\n", bsearch_1(0, 8, 3)); printf("%d\n", bsearch_2(0, 8, 3)); return 0; }