做了一些二分的题目,对这类题目还是有些害怕,希望整理过后可以做的好一点吧
二分的实质是找到一个边界,左半边满足这个性质,但右半边不满足这个性质(并不一定要满足单调的条件)
这样就可以通过二分来寻找边界,包括左边界与右边界
这里的左边界指的是右区间的左边界,右边界则是左区间的右边界。
注意:当题目出现XX最短/最小的最大值或者XX最长/最大的最小值,就要想到二分
- 情况一(求左区间的右边界)
当check函数成立的时候,此时mid处于红色区间(左区间),mid满足check,所以直接l = mid
当check函数不成立的时候,mid处于绿色区间(右区间),此时mid不满足check函数,所以需要减1向左侧靠拢r = mid - 1
注意:这种情况的mid需要加一,mid = l + r + 1 >> 1
代码:
mid = l + r + 1 >> 1
while l < r:
if check():
l = mid
else:
r = mid - 1
- 情况二(求右区间的左边界)
当check函数成立的时候,此时mid处于绿色区间(右区间),mid满足check,所以直接r = mid
当check函数不成立的时候,mid处于红色区间(左区间),此时mid不满足check函数,所以需要加1向右侧靠拢l = mid + 1
代码:
mid = l + r >> 1
while l < r:
if check():
r = mid
else:
l = mid + 1
做过的题目列表:
1. 洛谷 P2249. 【深基13.例1】查找
2. 洛谷 P1102. A-B 数对
3. 洛谷 P2440. 木材加工
4. 洛谷 P2678. 跳石头
5. 洛谷 P1678. 烦恼的高考志愿
6.
最近感觉做题的关键怎么在check函数上,只要想到check函数怎么写,就能做出来
二分跟着y总板子理解,多做题感觉就容易了,我之前也恐惧二分QAQ
加油qaq