整数二分模板(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 }

 

posted @ 2020-02-18 16:28  想拿牌想考研的菜鸡  阅读(157)  评论(0)    收藏  举报