zoukankan      html  css  js  c++  java
  • 关于上下界的二分查找

      /*记得以前做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
    
    */
  • 相关阅读:
    MONGODB全面总结
    MongoDB 进阶-关联查询
    MongoDB之DBref(关联插入,查询,删除) 实例深入
    MongoDB 聚合管道(Aggregation Pipeline)
    Mongodb索引基础
    MongoDB 全文搜索教程
    MongoDB数组修改器更新数据
    MongoDb查询详解
    服务器与客户端回叫
    Gauss列主消元
  • 原文地址:https://www.cnblogs.com/vongang/p/2775239.html
Copyright © 2011-2022 走看看