【算法】二分学习笔记
二分查找
在一段单调的序列上查找一个数,可以采用折半的方法,每次将查找的范围缩小一半
模板:
l=1,r=n; |
查找的复杂度为$ \mathcal{O}(\text{log}n)$
STL函数:
lower_bound(first,last,val);//first,last及返回值都为迭代器,可在最后加比较器 |
在非递减区间 \([first,last)\) 中进行二分查找,返回大于或等于 \(val\) 的第一个元素位置。如果所有元素都小于 \(val\) ,则返回 \(last\) 的位置。
upper_bound(first,last,val);//first,last及返回值都为迭代器,可在最后加比较器 |
在非递减区间 \([first,last)\) 中进行二分查找,返回大于 \(val\) 的第一个元素位置。如果所有元素都小于\(val\) ,则返回 \(last\) 的位置。
二分答案
适用条件:
- 最优解满足单调性
- 最优解满足有界性
即:
对于 \([a,b]\) 区间内的最优解 \(x_0,\) 满足:
\(\forall x_1<x_0 , x_1\) 均为次优解,$\forall x_2>x_0,x_2 $ 均为不可行解。
模板:
while(l<=r){ |
大部分二分答案的题目的框架是不变的,变化的只有两个部分:
\(sol\) 函数:根据每个题目写出具体的判断函数,需要注意取等条件
最终答案:需要具体判断
当 \(l==r\) 的时候,判断最终答案是 \(l\) 还是 \(l-1\)
一般来说,二分答案的题目的解很难直接求出,但很容易判断一个解是否可行
例题
P3017 [USACO11MAR]Brownie Slicing G
看到题目中的最大值最小,考虑用二分验证
前缀和维护即可
评论




