• 整数二分模板(AcWing.789)


    这里带来一手整数的二分模板。

    bool check(int x) {/* ... */} // 检查x是否满足某种性质
    
    // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
    int bsearch_1(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r >> 1;
            if (check(mid)) r = mid;    // check()判断mid是否满足性质
            else l = mid + 1;
        }
        return l;
    }
    // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
    int bsearch_2(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (check(mid)) l = mid; 
            else r = mid - 1;
        }
        return l;
    }

    二分模板有两个需要依据情况而定 如果满足题意需要让l=mid 那么我们需要让mid=l+r+1;另外一种则无需加1.

    下面让我们看一道例题来自AcWing.789

     1 #include<iostream>//这是一道整数二分的基础题输出各个数据在数组中的位置
     2 using namespace std;
     3 int n,q;
     4 const int N=1000010;
     5 int a[N];
     6 int main()
     7 {
     8     cin>>n>>q;
     9     for(int i=0; i<n; i++)
    10     {
    11         cin>>a[i];
    12     }
    13     while(q--)
    14     {
    15         int x;
    16         cin>>x;
    17         int l=0,r=n-1;
    18         while(l<r)
    19         {
    20              int mid=l+r>>1;
    21             if(a[mid]>=x) r=mid;
    22             else l=mid+1;
    23 
    24         }
    25         if(a[l]!=x) cout<<"-1 -1"<<endl;
    26         else
    27         {
    28             cout<<l<<' ';
    29             int l=0,r=n-1;
    30             while(l<r)
    31             {
    32                 int mid=l+r+1>>1;
    33                 if(a[mid]<=x) l=mid;
    34                 else r=mid-1;
    35                 }
    36             cout<<l<<endl;
    37         }
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    学习数据结构基础
    epoll
    pthread_create
    设置套接字选项
    5中I/O模型
    数据仓库一些整理(列式数据库)
    mysql分区方案的研究
    订单表的分库分表方案设计(大数据)
    从源码角度理清memcache缓存服务
    性能,不是不重要,而是,它没有可维护性重要
  • 原文地址:https://www.cnblogs.com/zyz010206/p/12326757.html
Copyright © 2020-2023  润新知