You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
const int N = 6;
|
|
|
|
|
int a[N] = {1, 2, 2, 3, 3, 4};
|
|
|
|
|
|
|
|
|
|
//模拟STL中的lower_bound,左闭右开写法
|
|
|
|
|
// int lower_bound(int x) {
|
|
|
|
|
// int l = 0, r = 7; //左闭右开
|
|
|
|
|
// while (l <= r) {
|
|
|
|
|
// int mid = (l + r) >> 1;
|
|
|
|
|
// if (x > a[mid])
|
|
|
|
|
// l = mid + 1;
|
|
|
|
|
// else
|
|
|
|
|
// r = mid - 1;
|
|
|
|
|
// }
|
|
|
|
|
// return l;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
int upper_bound(int x) {
|
|
|
|
|
int l = 0, r = N;
|
|
|
|
|
while (l <= r) {
|
|
|
|
|
int mid = l + ((r - l) >> 1);
|
|
|
|
|
if (x >= a[mid]) // upper的话等于的时候也返 //回右边,因为要找到大于最后一个key。
|
|
|
|
|
l = mid + 1;
|
|
|
|
|
else
|
|
|
|
|
r = mid - 1;
|
|
|
|
|
}
|
|
|
|
|
return l; //记得返回L。
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int lower_bound(int x) {
|
|
|
|
|
int l = 0, r = N;
|
|
|
|
|
while (l <= r) {
|
|
|
|
|
int mid = l + ((r - l) >> 1);
|
|
|
|
|
if (x > a[mid])
|
|
|
|
|
l = mid + 1;
|
|
|
|
|
else // lower相等时候就返回左边,因为要
|
|
|
|
|
//找到第一个key。
|
|
|
|
|
r = mid - 1;
|
|
|
|
|
}
|
|
|
|
|
return l;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
printf("%d\n", lower_bound(3));
|
|
|
|
|
printf("%d\n", upper_bound(3) - 1);
|
|
|
|
|
|
|
|
|
|
printf("%d\n", lower_bound(4));
|
|
|
|
|
printf("%d\n", upper_bound(4) - 1);
|
|
|
|
|
|
|
|
|
|
printf("%d\n", lower_bound(5));
|
|
|
|
|
printf("%d\n", upper_bound(5) - 1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|