|
|
#include <bits/stdc++.h>
|
|
|
// 需要仔细研究一下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;
|
|
|
} |