适用范围

两段性:在某个区间内,存在一个分界点,使得分界点一侧满足某性质,另一侧不满足

二分算法适用于具有“两段性”特征的问题,只要有高效的检验性质的方法,就可以在对数复杂度时间内求出分段点的位置。最基础的二分查找有对应 STL 的实现,根据处理数据的不同,还有整数二分和实数二分两种自定义性质检验的实现方式。

代码模板

代码模板-二分

经典例题

二分查找

  • 洛谷 P1102 A-B 数对:已知 NN1N2×1051\le N\le2\times10^5)个整数 aia_i0ai<2300\le a_i<2^{30})和正整数 CC1C<2301\le C<2^{30}),求满足 aiaj=Ca_i - a_j = C 的有序数对 (i,j)(i,j) 的个数(不同位置算不同)。
  • 洛谷 P1678 烦恼的高考志愿:已知学校数 mm1m1051\le m\le 10^5)、学生数 nn1n1051\le n\le 10^5),学校分数线数组 aia_i0ai1060\le a_i\le 10^6)和学生估分数组 bjb_j0bj1060\le b_j\le 10^6),求 j=1nmini=1mbjai\sum_{j=1}^{n} \min_{i=1}^{m} |b_j - a_i|(即每位学生与所有学校分数线的最小绝对差之和)。

整数二分

  • 洛谷 P1873 砍树:已知 NN1N1061\le N\le10^6)棵树的高度 hih_ihi4×105h_i\le4\times10^5)和所需木材总长 MM1M2×1091\le M\le2\times10^9,且 hi>M\sum h_i > M),求最大的整数高度 HH,使得锯下的木材总量 i=1Nmax(0,hiH)\sum\limits_{i=1}^{N}\max(0,\,h_i-H) 至少为 MM
  • 洛谷 P2440 木材加工:已知原木数量 nn1n1051\le n\le 10^5)、所需小段总数 kk1k1081\le k\le 10^8)和每根原木长度 LiL_i1Li1081\le L_i\le 10^8),求最大的正整数 ll(若不存在则为 00),使得 i=1nLilk\sum_{i=1}^{n} \left\lfloor \frac{L_i}{l} \right\rfloor \ge k
  • 洛谷 P1182 数列分段 Section II:已知正整数 NN1N1051\le N\le 10^5)、分段数 MMMNM\le N)和长度为 NN 的非负整数数列 AiA_iAi<108A_i<10^8),求最小的整数 SSS109S\le 10^9),使得数列可被划分为 MM 个连续段,且每段和均不超过 SS(即 minmaxk=1MikAi\min \max_{k=1}^M \sum_{i\in \text{第}k\text{段}} A_i)。
  • 洛谷 P2678 跳石头:已知起点到终点距离 LL1L1091\le L\le 10^9)、中间岩石数 NN0N500000\le N\le 50000)及其与起点的距离序列 DiD_i0<Di<L0<D_i<L,严格递增),至多移走 MM 块岩石(0MN0\le M\le N),求剩余岩石(含起点与终点)构成序列 SS 中相邻间距 gap(S)\text{gap}(S) 的最小值的最大值,即 maxS{1,,N},SM  min  gap(S)\max_{S\subseteq\{1,\dots,N\},\,|S|\le M}\;\min\;\text{gap}(S)。题解:洛谷 P2678 跳石头 - Solution
  • 洛谷 P1314 聪明的质监员:已知矿石数 nn1n2×1051\le n\le 2\times10^5)、区间数 mm1m2×1051\le m\le 2\times10^5)、标准值 ss0<s10120<s\le10^{12}),每个矿石 ii 有重量 wiw_i 和价值 viv_i0<wi,vi1060<w_i,v_i\le10^6),以及 mm 个区间 [li,ri][l_i,r_i]1lirin1\le l_i\le r_i\le n),定义检验值 y=i=1m(j=liri[wjW])(j=liri[wjW]vj)y=\sum_{i=1}^m \left( \sum_{j=l_i}^{r_i} [w_j\ge W] \right) \cdot \left( \sum_{j=l_i}^{r_i} [w_j\ge W]\cdot v_j \right),其中 WW 为可选参数(整数),求 minWsy\min_{W} |s-y|
  • 洛谷 P1083 借教室:已知天数 nn1n1061\le n\le 10^6)、订单数 mm1m1061\le m\le 10^6)、每天可用教室数 rir_i0ri1090\le r_i\le 10^9)和 mm 个订单 (dj,sj,tj)(d_j,s_j,t_j)0dj1090\le d_j\le 10^91sjtjn1\le s_j\le t_j\le n),按顺序处理订单,若存在最小编号 kk 使得 i[1,n]\exists i\in[1,n]j=1kdj[sjitj]>ri\sum_{j=1}^{k} d_j\cdot[s_j\le i\le t_j] > r_i,则输出 -1kk,否则输出 0
  • 洛谷 P4343 自动刷题机:已知日志行数 ll1l1051\le l\le 10^5)、目标题数 kkkk 在 int 范围内)和每行操作 xix_i109xi109-10^9\le x_i\le 10^9),其中 xi>0x_i>0 表示写 xix_i 行代码,xi<0x_i<0 表示删除 xi-x_i 行代码(若当前代码长度不足则全部删除),定义过程为初始代码长度为 00,依次执行操作,每次操作后若代码长度 n\ge nnn 为正整数)则提交并清零、题数加 11,求所有满足最终题数恰好为 kknn 的最小值和最大值,若不存在则输出 1-1

实数二分

  • 洛谷 P1024 一元三次方程求解:已知实数系数 a,b,c,da,b,c,d,方程 ax3+bx2+cx+d=0ax^3+bx^2+cx+d=0[100,100][-100,100] 内恰有三个不同实根,且两两之差的绝对值 1\ge 1,求这三个实根,按从小到大顺序输出,精确到小数点后 22 位。
  • 洛谷 P1577 切绳子:已知绳子数量 NN0<N100000<N\le 10000)、所需段数 KK0<K100000<K\le 10000)和每根绳子长度 LiL_i0<Li100000.000<L_i\le 100000.00,实数),求最大的实数 LL,使得 i=1NLiLK\sum_{i=1}^{N} \left\lfloor \frac{L_i}{L} \right\rfloor \ge K,结果保留到小数点后 22 位(直接舍去 22 位后的小数)。
  • 洛谷 P1163 银行贷款:已知贷款原值 w0w_0、每月还款额 ww 和还款月数 mm1w0,w23111\le w_0,w\le 2^{31}-11m30001\le m\le 3000),求月利率 rr(以小数表示,输出 100r100r 百分数形式,四舍五入到 0.1%0.1\%,且 100r300.0%100r\le 300.0\%),使得 w0=w1(1+r)mrw_0 = w \cdot \frac{1-(1+r)^{-m}}{r}
  • Codeforces 780B The Meeting Place Cannot Be Changed:已知朋友数 nn2n600002\le n\le 60000)、初始位置 xix_i 和最大速度 viv_i1xi,vi1091\le x_i,v_i\le 10^9),求最小时间 TT,使得存在实数 XX 满足 i\forall iXxiviT|X-x_i|\le v_i\cdot T(即所有 nn 个朋友可在同一地点汇合)。

本站由 zaochen 使用 Stellar 1.33.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
全站访问量 - 次 · 访客数 - 人 · 本页面浏览 -