重点: midmidmid 取 l+rl+rl+r 还是 l+r+1l+r+1l+r+1。 " === " 的话应该算那种情况。 代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include<cstdio>#include<algorithm>using namespace std;#define re registerconst int MAXn = 1e4;template <class T>inline void read(T &a) { register char c;while (c = getchar(), (c < '0' || c > '9') && c != '-');register bool f = c == '-';register T x = f ? 0 : c - '0';while (c = getchar(), c >= '0' && c <= '9') {x = (x << 3) + (x << 1) + (c ^ 48);}a = f ? -x : x;}int n, x, arr[MAXn + 10];int a() { //大于等于中最小的(lower_bound) int l = 1, r = n; while (l < r) { int mid = (l + r) >> 1; if (arr[mid] >= x) { r = mid; } else { l = mid + 1; } } return l;}int b() { //大于中最小的(upper_bound) int l = 1, r = n; while (l < r) { int mid = (l + r) >> 1; if (arr[mid] > x) { r = mid; } else { l = mid + 1; } } return l;}int c() { //小于中最大的 int l = 1, r = n; while (l < r) { int mid = (l + r + 1) >> 1; if (arr[mid] >= x) { r = mid - 1; } else { l = mid; } } return l;}int d() { //小于等于中最大的 int l = 1, r = n; while (l < r) { int mid = (l + r + 1) >> 1; if (arr[mid] > x) { r = mid - 1; } else { l = mid; } } return l;}int main() { read(n), read(x); for (re int i = 1; i <= n; ++i) { read(arr[i]); } printf("%d %d %d %d\n", a(), b(), c(), d()); // printf("%d %d\n", int(lower_bound(arr + 1, arr + 1 + n, x) - arr), int(upper_bound(arr + 1, arr + 1 + n, x) - arr));} 结果: