模板1
当我们将区间
[l, r]划分为[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1,计算mid时不需要加1,即mid = (l + r) / 2;int bsearch_1(int l, int r){while (l < r){int mid = (l + r)/2;if (check(mid)) r = mid;else l = mid + 1;}return l;}
模板2
当我们将区间
[l, r]划分为[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid,计算mid时需要加1,即mid = (l + r + 1) / 2;int bsearch_2(int l, int r){while (l < r){int mid = ( l + r + 1 ) /2;if (check(mid)) l = mid;else r = mid - 1;}return l;}
使用选择
二分缩小区间时观察左边界的更新情况来选择模板
- 循环结束优先取
r
