这里带来一手整数的二分模板。
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 }