林老师 · 客观题题库 · 第 35 章 分治与二分答案 · 知识细节练习

第 35 章 分治与二分答案 · 知识细节练习

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-第35章分治与二分答案-知识细节练习
题目总数100 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 16 大部分,合计 100 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

分治基础

6 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

分治的三步骤是?

(1 分)
第 2 题 A2 未作答

判断题:主定理思想——T(n)=2T(n/2)+O(n)T(n)=2T(n/2)+O(n) 的解是 O(nlogn)O(n \log n)(归并排序),T(n)=T(n/2)+O(1)T(n)=T(n/2)+O(1)O(logn)O(\log n)(二分)。

(1 分)
第 3 题 A3 未作答

判断题:快排、归并、快速幂都是分治——快排先分后治、归并先治后合、快速幂每次把指数砍半。

(1 分)
第 4 题 A4 未作答

判断题:二分/三分是"只留一半"的退化分治;二分答案则是"对答案二分 + check 验证"的套壳。

(1 分)
第 5 题 A5 未作答

判断题:分治要求子问题独立且同构——子问题互不依赖、结构相同,才能递归解决后合并。

(1 分)
第 6 题 A6 未作答

分治进阶总表是?

(1 分)

二分查找回顾

7 QUESTIONS · 2 POINTS EACH
第 7 题 B1 未作答

二分查找(左闭右开)的标准模板是?

(1 分)
第 8 题 B2 未作答

lower_bound 的语义是?

(1 分)
第 9 题 B3 未作答

判断题:lower_bound 找第一个 x\ge x、upper_bound 找第一个 >x> x——两者之差 = x 的出现次数。

(1 分)
第 10 题 B4 未作答

判断题:模板边界必须配套——r = midl = mid + 1(左闭右开);l = midmid = (l + r + 1) / 2(找最后一个满足)。

(1 分)
第 11 题 B5 未作答

判断题:mid = l + (r - l) / 2 防溢出——(l + r) / 2 在 l、r 接近 int 上限时相加溢出。

(1 分)
第 12 题 B6 未作答

判断题:二分变体——第一个 ≥x、第一个 >x、最后一个 <x、最后一个 ≤x,本质都是同模板改比较符与更新方向。

(1 分)
第 13 题 B7 未作答

判断题:二分查找 O(logn)O(\log n)——每次把区间砍半,nn 个元素最多比较约 log2n\log_2 n 次。

(1 分)

二分答案

7 QUESTIONS · 2 POINTS EACH
第 14 题 C1 未作答

二分答案的框架思想是?

(1 分)
第 15 题 C2 未作答

判断题:二分答案的前提是单调性——"mid 可行 ⟹ 更小/更大的也可行",没有单调性就不能二分。

(1 分)
第 16 题 C3 未作答

check(mid) 函数的作用是?

(1 分)
第 17 题 C4 未作答

判断题:最大化最小值(答案越大越好)用 mid = (l + r + 1) / 2,可行则 l = mid——防死循环的关键是 mid 向上取整。

(1 分)
第 18 题 C5 未作答

判断题:最小化最大值(答案越小越好)用 mid = (l + r) / 2,可行则 r = mid——与最大化最小正好对称。

(1 分)
第 19 题 C6 未作答

判断题:实数二分不用纠结边界——for (int i = 0; i < 100; i++) 固定迭代 100 次,精度远超要求。

(1 分)
第 20 题 C7 未作答

判断题:例题思想——跳石头、数列分段(最小化最大段和)、木材切割、牛栏(最大化最小距离)全是"二分答案 + 贪心 check"。

(1 分)

三分查找

7 QUESTIONS · 2 POINTS EACH
第 21 题 D1 未作答

单峰函数是?

(1 分)
第 22 题 D2 未作答

三分查找的核心思想是?

(1 分)
第 23 题 D3 未作答

判断题:三分适用于单峰函数(凸/凹均可);多峰函数三分会漏掉真正的全局极值。

(1 分)
第 24 题 D4 未作答

判断题:二分靠"单调性"、三分靠"单峰性"——二分每次砍一半、三分每次砍三分之一(常数更大)。

(1 分)
第 25 题 D5 未作答

判断题:三分只能求极小值,不能求极大值。

(1 分)
第 26 题 D6 未作答

判断题:三分复杂度 O(logn)O(\log n)(同阶二分,常数约大 1.7 倍)——区间每次乘 23\frac{2}{3} 收缩。

(1 分)
第 27 题 D7 未作答

判断题:浮点三分用固定迭代次数(如 200 次)或 r - l > eps 判断收敛,注意 eps 别小于浮点精度。

(1 分)

CDQ 分治思想

6 QUESTIONS · 2 POINTS EACH
第 28 题 E1 未作答

判断题:三维偏序(aiaja_i \le a_jbibjb_i \le b_jcicjc_i \le c_j)用 CDQ 分治——按 a 排序后,分治解决 b 维、数据结构解决 c 维。

(1 分)
第 29 题 E2 未作答

判断题:CDQ 分治的核心动作——左半对右半的贡献:左半按 b 排序、右半按 b 排序,双指针合并统计。

(1 分)
第 30 题 E3 未作答

判断题:CDQ 分治是离线算法——所有询问必须一次性给出,不能边问边答。

(1 分)
第 31 题 E4 未作答

CDQ 处理三维偏序时,第三维 c 常用?

(1 分)
第 32 题 E5 未作答

判断题:CDQ 分治适用于所有问题——任何排序/计数问题都能用它优化。

(1 分)
第 33 题 E6 未作答

判断题:CDQ 分治复杂度 O(nlogn)O(n \log n)(或带树状数组的 O(nlog2n)O(n \log^2 n))——每层合并 O(n)O(n),共 logn\log n 层。

(1 分)

整体二分思想

6 QUESTIONS · 2 POINTS EACH
第 34 题 F1 未作答

判断题:整体二分的"二分"是对答案值域二分,不是对数组下标二分——所有询问共享同一次二分过程。

(1 分)
第 35 题 F2 未作答

判断题:整体二分是离线批量算法——一次处理所有"第 k 小"类询问,避免每个询问单独二分。

(1 分)
第 36 题 F3 未作答

整体二分的核心思想是?

(1 分)
第 37 题 F4 未作答

判断题:整体二分适用场景——多组"区间第 k 小"、带修改第 k 小等"答案可二分且可批量判断"的询问。

(1 分)
第 38 题 F5 未作答

判断题:整体二分比"每个询问单独二分"少大量重复统计——共享二分过程,复杂度 O((n+m)log值域)O((n+m) \log 值域) 级别。

(1 分)
第 39 题 F6 未作答

判断题:整体二分每层对序列做一次 O(n)O(n) 统计,共 log值域\log 值域 层——优于逐询问二分的 O(mlog值域n)O(m \log 值域 \cdot n)

(1 分)

分治应用

6 QUESTIONS · 2 POINTS EACH
第 40 题 G1 未作答

判断题:最大子段和的分治法——跨中点子段 = 左半后缀最大 + 右半前缀最大,与两半内部取三者 max。

(1 分)
第 41 题 G2 未作答

判断题:最近点对分治思想——按 x 排序分两半,递归求各半最近距离 d,再检查"跨中线宽度 2d 的带状区域"。

(1 分)
第 42 题 G3 未作答

快速幂的核心思想是?

(1 分)
第 43 题 G4 未作答

逆序对的定义是?

(1 分)
第 44 题 G5 未作答

判断题:棋盘覆盖问题(L 形骨牌铺满缺一角的棋盘)——分治:把棋盘四等分,缺口所在的子棋盘递归,其余三块各占一格再递归。

(1 分)
第 45 题 G6 未作答

判断题:分治应用综合——子段和/最近点对靠"跨中点合并"、快速幂靠"指数砍半"、逆序对靠"归并时计数"。

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

判断题:二分死循环——l = mid 却配 mid = (l + r) / 2(向下取整),当 l 与 r 相邻时 mid 恒等于 l,死循环。

(1 分)
第 47 题 H2 未作答

判断题:check 不具备单调性时二分答案会收敛到错误值——先证明单调性再二分。

(1 分)
第 48 题 H3 未作答

判断题:只要函数连续,三分就能求出全局极值。

(1 分)
第 49 题 H4 未作答

判断题:CDQ 分治要处理"左对右的贡献"——边界(l==r 返回、左右有序性、同值元素)处理不当会漏算或重算。

(1 分)
第 50 题 H5 未作答

判断题:以下结论全部正确——"二分模板 l<r 配 r=mid/l=mid+1;二分答案要单调 check;三分只适用单峰;快速幂 O(log b);CDQ 与整体二分都是离线算法"。

(1 分)

二分查找代码

6 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {0, 1, 3, 5, 7, 9};   // 下标 1 起,升序
05    int x = 5;
06    int l = 1, r = 5;
07    while (l < r) {
08        int mid = (l + r) / 2;
09        if (a[mid] >= x) r = mid;
10        else l = mid + 1;
11    }
12    cout << l;                        // 第一个 >= 5 的位置
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 52 题 I2 未作答

01// 数组同 I1,查找 x = 2(不存在),输出每次的 mid:
02int l = 1, r = 5;
03while (l < r) {
04    int mid = (l + r) / 2;
05    cout << mid << " ";
06    if (a[mid] >= 2) r = mid;
07    else l = mid + 1;
08}

单选题:程序输出是?(mid 的取值序列)

(1 分)
第 53 题 I3 未作答

// 数组 {0,1,3,5,5,5,7}(下标 1 起),x = 5,手写 lower_bound

单选题:程序输出是?(第一个 ≥5 的位置)

(1 分)
第 54 题 I4 未作答

// 数组 {0,1,3,5,5,5,7}(下标 1 起),x = 5,手写 upper_bound
// (找第一个 > 5 的位置)

单选题:程序输出是?(第一个 >5 的位置)

(1 分)
第 55 题 I5 未作答

01while (l < r) {
02    int mid = ______;                  // 防溢出中点
03    if (a[mid] >= x) r = mid;
04    else l = mid + 1;
05}

单选题:横线处应填入?

(1 分)
第 56 题 I6 未作答

// 数组 {0,1,3,5,7,9}(下标 1 起),x = 6(不存在),手写 lower_bound

单选题:程序输出是?(6 应插入的位置)

(1 分)

二分答案代码

6 QUESTIONS · 2 POINTS EACH
第 57 题 J1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 5, m = 3;
04int a[6] = {0, 4, 2, 4, 5, 1};
05bool check(int mid) {                  // 每段和 <= mid 能否分成 <= m 段
06    int cnt = 1, sum = 0;
07    for (int i = 1; i <= n; i++) {
08        if (sum + a[i] > mid) { cnt++; sum = 0; }
09        sum += a[i];
10    }
11    return cnt <= m;
12}
13int main() {
14    int l = 0, r = 16;
15    while (l < r) {                    // 最小化最大段和
16        int mid = (l + r) / 2;
17        if (check(mid)) r = mid;
18        else l = mid + 1;
19    }
20    cout << l;
21    return 0;
22}

单选题:程序输出是?(分成 3 段的最小最大段和)

(1 分)
第 58 题 J2 未作答

// 3 根木材长度 {10,20,30},要切出 6 段等长,求最大段长
// check(len):sum(a[i] / len) >= 6 ?
// len=10 → 1+2+3=6 ✓;len=11 → 0+1+2=3 ✗

单选题:程序输出是?

(1 分)
第 59 题 J3 未作答

// 牛栏位置 {1,2,4,8,9},放 3 头牛,最大化最小距离
// check(d):贪心放牛,间距 >= d 能否放 3 头
// d=3:1、4、8 三头 ✓;d=4:1、8 两头 ✗

单选题:程序输出是?

(1 分)
第 60 题 J4 未作答

01while (l < r) {                       // 最大化最小值:mid 要向上取整
02    int mid = ______;
03    if (check(mid)) l = mid;
04    else r = mid - 1;
05}

单选题:横线处应填入?

(1 分)
第 61 题 J5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double l = 0, r = 2, x = 2;       // 求 sqrt(2)
05    for (int i = 0; i < 100; i++) {
06        double mid = (l + r) / 2;
07        if (mid * mid >= x) r = mid;
08        else l = mid;
09    }
10    cout << fixed << setprecision(6) << l;
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 62 题 J6 未作答

// 数列 {2,3,7,3} 分成 2 段,最小化最大段和
// check(mid):每段和 <= mid 能否分成 <= 2 段
// mid=10:2+3=5、7+3=10 → 2 段 ✓;mid=9:2+3=5、7、3 → 3 段 ✗

单选题:程序输出是?

(1 分)
拾壹

三分代码

7 QUESTIONS · 2 POINTS EACH
第 63 题 K1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int x) { return (x - 2) * (x - 2); }   // 极小点在 2
04int main() {
05    int l = 0, r = 4;
06    while (r - l > 2) {
07        int mid1 = l + (r - l) / 3;
08        int mid2 = r - (r - l) / 3;
09        if (f(mid1) < f(mid2)) r = mid2;
10        else l = mid1;
11    }
12    cout << (l + r) / 2;
13    return 0;
14}

单选题:程序输出是?(极小点)

(1 分)
第 64 题 K2 未作答

01// f(x) = -x² + 4x 在 [0,4],极大点在 2、极大值 4
02// 三分求极大:if (f(mid1) < f(mid2)) l = mid1; else r = mid2;
03// 输出 f((l + r) / 2)

单选题:程序输出是?

(1 分)
第 65 题 K3 未作答

// f(x) = (x-2)² 在 [0,4] 求极小,每轮输出 mid1、mid2:
// 第 1 轮 [0,4]:mid1=1、mid2=3
// 第 2 轮 [1,4]:mid1=2、mid2=3(f(1)=f(3) 时走 l=mid1)

单选题:程序输出是?

(1 分)
第 66 题 K4 未作答

01while (r - l > 2) {
02    int mid1 = ______;                // 第一个三分点
03    int mid2 = r - (r - l) / 3;
04    ...
05}

单选题:横线处应填入?

(1 分)
第 67 题 K5 未作答

// f(x) = x² 在 [-2,2]:先减后增,是单峰函数(凹)
// 输出判定结果

单选题:程序输出是?

(1 分)
第 68 题 K6 未作答

// f(x) = |x - 1| 在 [0,4] 求极小点,浮点三分,输出 6 位小数

单选题:程序输出是?

(1 分)
第 69 题 K7 未作答

// f(x) = (x - 3)² + 1 在 [0,6],三分求极小值(f(3) = 1)

单选题:程序输出是?

(1 分)
拾贰

分治应用代码

6 QUESTIONS · 2 POINTS EACH
第 70 题 L1 未作答

// 数组 {-2,1,-3,4,-1,2,1,-5,4},分治求最大子段和
// 递归:左半最大、右半最大、跨中点(左后缀最大 + 右前缀最大)取三者 max
// 答案为 6(子段 4,-1,2,1)

单选题:程序输出是?

(1 分)
第 71 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[9] = {0, 3, 1, 4, 1, 5, 9, 2, 6};
04int tmp[9];
05long long cnt = 0;
06void merge(int l, int mid, int r) {
07    int i = l, j = mid + 1, k = l;
08    while (i <= mid && j <= r) {
09        if (a[i] <= a[j]) tmp[k++] = a[i++];
10        else { tmp[k++] = a[j++]; cnt += mid - i + 1; }
11    }
12    while (i <= mid) tmp[k++] = a[i++];
13    while (j <= r) tmp[k++] = a[j++];
14    for (int x = l; x <= r; x++) a[x] = tmp[x];
15}
16void msort(int l, int r) {
17    if (l >= r) return;
18    int mid = (l + r) / 2;
19    msort(l, mid); msort(mid + 1, r);
20    merge(l, mid, r);
21}
22int main() { msort(1, 8); cout << cnt; return 0; }

单选题:程序输出是?(逆序对个数)

(1 分)
第 72 题 L3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03long long qpow(long long a, long long b) {
04    long long res = 1;
05    while (b) {
06        if (b & 1) res *= a;
07        a *= a;
08        b >>= 1;
09    }
10    return res;
11}
12int main() { cout << qpow(2, 10); return 0; }

单选题:程序输出是?

(1 分)
第 73 题 L4 未作答

// 3^5 mod 7:3^5 = 243,243 mod 7 = 5

单选题:程序输出是?

(1 分)
第 74 题 L5 未作答

01while (i <= mid && j <= r) {
02    if (a[i] <= a[j]) tmp[k++] = ______;   // 取左半元素
03    else { tmp[k++] = a[j++]; cnt += mid - i + 1; }
04}

单选题:横线处应填入?

(1 分)
第 75 题 L6 未作答

// 一维最近点对:数轴上 {1,10,12},最近两点 10 与 12,距离 2

单选题:程序输出是?

(1 分)
拾叁

CDQ 与整体二分代码

6 QUESTIONS · 2 POINTS EACH
第 76 题 M1 未作答

// 归并排序 {3,1,4,1,5,9,2,6},输出排序结果

单选题:程序输出是?

(1 分)
第 77 题 M2 未作答

// 数组 {3,1,4,1,5,9,2,6},整体二分求第 3 小的数
// 排序后 {1,1,2,3,4,5,6,9},第 3 小 = 2

单选题:程序输出是?

(1 分)
第 78 题 M3 未作答

// 点 (1,2)、(2,1)、(3,3),统计 i<j 且 xi<xj 且 yi<yj 的数对
// (1,2)-(3,3) ✓、(2,1)-(3,3) ✓ → 共 2

单选题:程序输出是?

(1 分)
第 79 题 M4 未作答

01if (cnt >= k) 询问归入左半;
02else {
03    ______;                           // k 减去左半贡献
04    询问归入右半;
05}

单选题:横线处应填入?

(1 分)
第 80 题 M5 未作答

// 树状数组求逆序对:{3,1,4,1,5,9,2,6}(离散化后按值插入统计)

单选题:程序输出是?

(1 分)
第 81 题 M6 未作答

// 数组 {3,1,4,1,5,9,2,6},整体二分批量回答 k=1、k=2、k=3 的询问
// 答案分别为 1、1、2

单选题:程序输出是?

(1 分)
拾肆

综合代码

6 QUESTIONS · 2 POINTS EACH
第 82 题 N1 未作答

// {1,3,5,7,9} 中 lower_bound(7) 的位置

单选题:程序输出是?

(1 分)
第 83 题 N2 未作答

// {10,20,30} 切 6 段等长,最大段长

单选题:程序输出是?

(1 分)
第 84 题 N3 未作答

// f(x) = (x-2)² 在 [0,4],三分求极小点

单选题:程序输出是?

(1 分)
第 85 题 N4 未作答

// qpow(2, 10)

单选题:程序输出是?

(1 分)
第 86 题 N5 未作答

01bool check(int mid) {
02    int cnt = 1, sum = 0;
03    for (int i = 1; i <= n; i++) {
04        if (sum + a[i] > mid) { cnt++; sum = ______; }   // 另起一段
05        else sum += a[i];
06    }
07    return cnt <= m;
08}

单选题:横线处应填入?

(1 分)
第 87 题 N6 未作答

// {4,2,4,5,1} 分 3 段,最小化最大段和

单选题:程序输出是?

(1 分)
拾伍

完善程序

7 QUESTIONS · 2 POINTS EACH
第 88 题 O1 未作答

01int l = 1, r = n;
02while (①) {                          // 左闭右开写法
03    int mid = (l + r) / 2;
04    if (a[mid] >= x) r = mid;
05    else l = mid + 1;
06}

单选题:①处应填?

(1 分)
第 89 题 O2 未作答

01if (a[mid] >= x) r = mid;
02else l = ①;                          // 左边界右移

单选题:①处应填?

(1 分)
第 90 题 O3 未作答

01while (l < r) {                      // 最小化最大值
02    int mid = (l + r) / 2;
03    if (check(mid)) r = mid;
04    else l = ①;
05}

单选题:①处应填?

(1 分)
第 91 题 O4 未作答

01while (r - l > 2) {
02    int mid1 = ①;
03    int mid2 = r - (r - l) / 3;
04    ...
05}

单选题:①处应填?

(1 分)
第 92 题 O5 未作答

01while (b) {
02    if (b & 1) res = res * a % mod;
03    a = a * a % mod;
04    ①;                               // 指数右移一位
05}

单选题:①处应填?

(1 分)
第 93 题 O6 未作答

01// 归并完成后把 tmp 写回原数组:
02for (int x = l; x <= r; x++) a[x] = ①;

单选题:①处应填?

(1 分)
第 94 题 O7 未作答

01bool check(int mid) {
02    int cnt = 1, sum = 0;
03    for (int i = 1; i <= n; i++) {
04        if (sum + a[i] > mid) { cnt++; sum = ①; }
05        sum += a[i];
06    }
07    return cnt <= m;
08}

单选题:①处应填?(先清空再累加当前元素)

(1 分)
拾陆

代码易错

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

01int l = 1, r = 2;                    // 数组 {0,1,3},查 x = 3
02while (l < r) {
03    int mid = (l + r) / 2;
04    if (a[mid] >= 3) r = mid;
05    else l = mid;                    // 注意:漏了 +1
06}

单选题:程序会怎样?

(1 分)
第 96 题 P2 未作答

01// 求 sqrt(2),但只迭代到精度 1e-3 就停止:
02while (r - l > 1e-3) { ... }
03// 输出 6 位小数

单选题:程序输出是?(正确结果应为 1.414214

(1 分)
第 97 题 P3 未作答

01// f(x) = (x-2)² 在 [0,4] 求极小,但三分更新写成了"求极大"的规则:
02// if (f(mid1) < f(mid2)) l = mid1; else r = mid2;
03// [0,4]:mid1=1、mid2=3,f 相等走 else → r=3
04// [0,3]:mid1=1、mid2=2,f(1)=1 > f(2)=0 → r=2
05// 最终输出 (0+2)/2 = 1

单选题:程序输出是?(正确极小点应为 2

(1 分)
第 98 题 P4 未作答

01void msort(int l, int r) {
02    if (l >= r) return;
03    int mid = (l + r) / 2;
04    msort(l, mid);
05    msort(mid + 1, r);
06    // 注意:漏掉了 merge(l, mid, r) —— 只拆不合
07}
08// 最后输出原数组

单选题:程序输出是?

(1 分)
第 99 题 P5 未作答

01// 快速幂把 b >>= 1 写成了 b--:
02long long res = 1;
03while (b) {
04    if (b & 1) res *= a;
05    a *= a;
06    b--;                             // 注意:应为 b >>= 1
07}
08cout << qpow(2, 3);                  // 正确结果应为 8

单选题:程序输出是?

(1 分)
第 100 题 P6 未作答

判断题:以下五种易错写法都会导致程序出错——①二分 l = mid 漏 +1(死循环)②实数二分精度不足(答案误差大)③三分更新规则用反(收敛到错误点)④归并只拆不合(数组没排序)⑤快速幂 b-- 代替 b >>= 1(结果翻倍错误)。

(1 分)