关于上下界的二分查找

  /*记得以前做cf就吃过这上面的亏,今天队里的比赛又挂了好几次才推
出来。。。晚上整理了一下,分别写了写>= , > , <= , <这四种情况。(== 就
不用写了),测试数据包含最小值和最大值的测试,有些情况结果是非法的,输出为-1 或 n*/


//#pragma comment(linker,"/STACK:327680000,327680000")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>

#define CL(arr, val)    memset(arr, val, sizeof(arr))
#define REP(i, n)       for((i) = 0; (i) < (n); ++(i))
#define FOR(i, l, h)    for((i) = (l); (i) <= (h); ++(i))
#define FORD(i, h, l)   for((i) = (h); (i) >= (l); --(i))
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define Read()  freopen("data.in", "r", stdin)
#define Write() freopen("data.out", "w", stdout);

typedef long long LL;
const double eps = 1e-8;
const double PI = acos(-1.0);
const int inf = ~0u>>2;


using namespace std;

int a[111], n;

//a[l] <= tar
int bs1(int tar) {
    int l = -1, r = n, mid;
    while(r - l > 1) {
        mid = MID(l, r);
        if(a[mid] <= tar)   l = mid;
        else    r = mid;
    }
    return l;
}

//a[l] < tar
int bs2(int tar) {
    int l = -1, r = n, mid;
    while(r - l > 1) {
        mid = MID(l, r);
        if(a[mid] < tar)   l = mid;
        else    r = mid;
    }
    return l;
}

//tar < a[l]
int bs3(int tar) {
    int l = -1, r = n, mid;
    while(r > l) {
        mid = MID(l, r);
        if(a[mid] <= tar)    l = mid + 1;
        else    r = mid;
    }
    return l;
}

//tar <= a[l]
int bs4(int tar) {
    int l = -1, r = n, mid;
    while(r > l) {
        mid = MID(l, r);
        if(a[mid] < tar)   l = mid + 1;
        else    r = mid;
    }
    return l;
}

int main() {
    Read();

    cin >> n;
    for(int i = 0; i < n; ++i)  cin >> a[i];
    sort(a, a + n);

    for(int i = 0; i < n; ++i)  printf("%-3d", i);
    puts("");
    for(int i = 0; i < n; ++i)  printf("%-3d", a[i]);
    puts("");

    int fd, num;
    cin >> num;
    while(num--) {
        cin >> fd;
        cout << endl;
        cout << "Test " << fd << endl;

        printf("<= %d : %d\n", fd, bs1(fd));
        printf("< %d  : %d\n", fd, bs2(fd));
        printf("> %d  : %d\n", fd, bs3(fd));
        printf(">= %d : %d\n", fd, bs4(fd));
    }
    return 0;
}


/*
Test Case:
14
-1 1 0 2 3 3 3 3 3 3 3 4 5 5

4
-1
0
2
3
5

ans:
0  1  2  3  4  5  6  7  8  9  10 11 12 13 
-1 0  1  2  3  3  3  3  3  3  3  4  5  5  

Test -1
x <= -1 : 0
x < -1  : -1
x > -1  : 1
x >= -1 : -1

Test 0
x <= 0 : 1
x < 0  : 0
x > 0  : 2
x >= 0 : 1

Test 2
x <= 2 : 3
x < 2  : 2
x > 2  : 4
x >= 2 : 3

Test 3
x <= 3 : 10
x < 3  : 3
x > 3  : 11
x >= 3 : 4

*/
原文地址:https://www.cnblogs.com/vongang/p/2775239.html