适用范围
两段性:在某个区间内,存在一个分界点,使得分界点一侧满足某性质,另一侧不满足
二分算法适用于具有“两段性”特征的问题,只要有高效的检验性质的方法,就可以在对数复杂度时间内求出分段点的位置。最基础的二分查找有对应 STL 的实现,根据处理数据的不同,还有整数二分和实数二分两种自定义性质检验的实现方式。
代码模板
代码模板-二分
经典例题
二分查找
- 洛谷 P1102 A-B 数对:已知 N(1≤N≤2×105)个整数 ai(0≤ai<230)和正整数 C(1≤C<230),求满足 ai−aj=C 的有序数对 (i,j) 的个数(不同位置算不同)。
- 洛谷 P1678 烦恼的高考志愿:已知学校数 m(1≤m≤105)、学生数 n(1≤n≤105),学校分数线数组 ai(0≤ai≤106)和学生估分数组 bj(0≤bj≤106),求 ∑j=1nmini=1m∣bj−ai∣(即每位学生与所有学校分数线的最小绝对差之和)。
整数二分
- 洛谷 P1873 砍树:已知 N(1≤N≤106)棵树的高度 hi(hi≤4×105)和所需木材总长 M(1≤M≤2×109,且 ∑hi>M),求最大的整数高度 H,使得锯下的木材总量 i=1∑Nmax(0,hi−H) 至少为 M。
- 洛谷 P2440 木材加工:已知原木数量 n(1≤n≤105)、所需小段总数 k(1≤k≤108)和每根原木长度 Li(1≤Li≤108),求最大的正整数 l(若不存在则为 0),使得 ∑i=1n⌊lLi⌋≥k。
- 洛谷 P1182 数列分段 Section II:已知正整数 N(1≤N≤105)、分段数 M(M≤N)和长度为 N 的非负整数数列 Ai(Ai<108),求最小的整数 S(S≤109),使得数列可被划分为 M 个连续段,且每段和均不超过 S(即 minmaxk=1M∑i∈第k段Ai)。
- 洛谷 P2678 跳石头:已知起点到终点距离 L(1≤L≤109)、中间岩石数 N(0≤N≤50000)及其与起点的距离序列 Di(0<Di<L,严格递增),至多移走 M 块岩石(0≤M≤N),求剩余岩石(含起点与终点)构成序列 S 中相邻间距 gap(S) 的最小值的最大值,即 maxS⊆{1,…,N},∣S∣≤Mmingap(S)。题解:洛谷 P2678 跳石头 - Solution
- 洛谷 P1314 聪明的质监员:已知矿石数 n(1≤n≤2×105)、区间数 m(1≤m≤2×105)、标准值 s(0<s≤1012),每个矿石 i 有重量 wi 和价值 vi(0<wi,vi≤106),以及 m 个区间 [li,ri](1≤li≤ri≤n),定义检验值 y=∑i=1m(∑j=liri[wj≥W])⋅(∑j=liri[wj≥W]⋅vj),其中 W 为可选参数(整数),求 minW∣s−y∣。
- 洛谷 P1083 借教室:已知天数 n(1≤n≤106)、订单数 m(1≤m≤106)、每天可用教室数 ri(0≤ri≤109)和 m 个订单 (dj,sj,tj)(0≤dj≤109,1≤sj≤tj≤n),按顺序处理订单,若存在最小编号 k 使得 ∃i∈[1,n],∑j=1kdj⋅[sj≤i≤tj]>ri,则输出
-1 和 k,否则输出 0。
- 洛谷 P4343 自动刷题机:已知日志行数 l(1≤l≤105)、目标题数 k(k 在 int 范围内)和每行操作 xi(−109≤xi≤109),其中 xi>0 表示写 xi 行代码,xi<0 表示删除 −xi 行代码(若当前代码长度不足则全部删除),定义过程为初始代码长度为 0,依次执行操作,每次操作后若代码长度 ≥n(n 为正整数)则提交并清零、题数加 1,求所有满足最终题数恰好为 k 的 n 的最小值和最大值,若不存在则输出 −1。
实数二分
- 洛谷 P1024 一元三次方程求解:已知实数系数 a,b,c,d,方程 ax3+bx2+cx+d=0 在 [−100,100] 内恰有三个不同实根,且两两之差的绝对值 ≥1,求这三个实根,按从小到大顺序输出,精确到小数点后 2 位。
- 洛谷 P1577 切绳子:已知绳子数量 N(0<N≤10000)、所需段数 K(0<K≤10000)和每根绳子长度 Li(0<Li≤100000.00,实数),求最大的实数 L,使得 ∑i=1N⌊LLi⌋≥K,结果保留到小数点后 2 位(直接舍去 2 位后的小数)。
- 洛谷 P1163 银行贷款:已知贷款原值 w0、每月还款额 w 和还款月数 m(1≤w0,w≤231−1,1≤m≤3000),求月利率 r(以小数表示,输出 100r 百分数形式,四舍五入到 0.1%,且 100r≤300.0%),使得 w0=w⋅r1−(1+r)−m。
- Codeforces 780B The Meeting Place Cannot Be Changed:已知朋友数 n(2≤n≤60000)、初始位置 xi 和最大速度 vi(1≤xi,vi≤109),求最小时间 T,使得存在实数 X 满足 ∀i,∣X−xi∣≤vi⋅T(即所有 n 个朋友可在同一地点汇合)。