林老师 · 客观题题库 · 专题 21 前缀和·差分·双指针 · 复习强化

专题 21 前缀和·差分·双指针 · 复习强化

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

判 分 报 告

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

前缀和概念

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

前缀和数组 pre[i] 的定义是( )。

(1 分)
第 2 题 A2 未作答

前缀和惯例让数组从下标 11 开始存,pre[0] = 0,好处是( )。

(1 分)
第 3 题 A3 未作答

前缀和的递推式是( )。

(1 分)
第 4 题 A4 未作答

区间 [l,r][l, r](闭区间、下标 11 起)的元素和用前缀和表示是( )。

(1 分)
第 5 题 A5 未作答

pre[r] - pre[l-1] 能算出区间 [l,r][l,r] 的和,其原理是( )。

(1 分)
第 6 题 A6 未作答

nn 个数建前缀和数组的时间复杂度是( )。

(1 分)
第 7 题 A7 未作答

nn 个数的前缀和,pre 数组通常开多大( )。

(1 分)
第 8 题 A8 未作答

「每次查询都循环累加 [l,r][l,r]」与「先建前缀和再查表」的对比,正确的是( )。

(1 分)

前缀和应用

6 QUESTIONS · 2 POINTS EACH
第 9 题 B1 未作答

前缀和区间求和的标准三步是( )。

(1 分)
第 10 题 B2 未作答

mm 次区间和查询、数据规模 nn,前缀和法的总复杂度是( )。

(1 分)
第 11 题 B3 未作答

「前 kk 项的平均值」用前缀和写是( )。

(1 分)
第 12 题 B4 未作答

用前缀和的视角看最大子段和:以 jj 结尾的最大子段和等于( )。

(1 分)
第 13 题 B5 未作答

pre[i] == pre[j]i<ji < j)说明( )。

(1 分)
第 14 题 B6 未作答

「有多少个子段的和恰好等于 kk」可以转化为( )。

(1 分)

差分概念

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

差分数组 d[i] 的定义是( )。

(1 分)
第 16 题 C2 未作答

差分与前缀和的关系是( )。

(1 分)
第 17 题 C3 未作答

把区间 [l,r][l, r] 的每个数都加 vv,在差分数组上的操作是( )。

(1 分)
第 18 题 C4 未作答

所有区间操作结束后得到最终数组,需要对差分数组做( )。

(1 分)
第 19 题 C5 未作答

还原后位置 ii 的值 b[i] = d[1] + d[2] + ... + d[i],这说明( )。

(1 分)
第 20 题 C6 未作答

区间 [l,r][l, r]vv 时,减点为什么打在 r + 1 而不是 r( )。

(1 分)
第 21 题 C7 未作答

多个「区间加」操作叠加时,差分法的优势是( )。

(1 分)

差分应用

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

差分法「区间加」的标准三步是( )。

(1 分)
第 23 题 D2 未作答

「先收齐所有操作、最后一次性还原」的处理思想称为(大纲未明列、上机通用)( )。

(1 分)
第 24 题 D3 未作答

若干次「区间涂色,后涂覆盖先涂」,问最终每种颜色的位置数。用差分存「颜色编号的加减」,本质是( )。

(1 分)
第 25 题 D4 未作答

mm 次「区间 [l,r][l,r]vv」后输出整个数组,差分法总复杂度是( )。

(1 分)
第 26 题 D5 未作答

给定原数组 a[1..n],它的差分数组 d[1..n] 是(约定 d[1] = a[1])( )。

(1 分)
第 27 题 D6 未作答

「区间 [l,r][l,r] 每个数 vv」在差分上的写法是( )。

(1 分)
第 28 题 D7 未作答

若干次区间加之后只查询一个位置 pp 的值,差分视角下最快的算法是( )。

(1 分)

二维前缀和

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

二维前缀和递推 s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j] 中减去 s[i-1][j-1] 的原因是( )。

(1 分)
第 30 题 E2 未作答

二维前缀和 s[i][j] 表示( )。

(1 分)
第 31 题 E3 未作答

子阵 [(x1,y1),(x2,y2)][(x_1,y_1), (x_2,y_2)] 的和用二维前缀和表示是( )。

(1 分)
第 32 题 E4 未作答

整个 n×mn \times m 矩阵的元素和等于(下标 1 起)( )。

(1 分)
第 33 题 E5 未作答

二维前缀和数组的第 00 行与第 00 列全为 00,作用是( )。

(1 分)
第 34 题 E6 未作答

二维前缀和最典型的应用场景是( )。

(1 分)

双指针概念

7 QUESTIONS · 2 POINTS EACH
第 35 题 F1 未作答

对撞指针(相向双指针)的形态是( )。

(1 分)
第 36 题 F2 未作答

同向双指针(快慢指针)的典型形态是( )。

(1 分)
第 37 题 F3 未作答

滑动窗口本质上是( )。

(1 分)
第 38 题 F4 未作答

双指针之所以是 O(n)O(n),本质原因是( )。

(1 分)
第 39 题 F5 未作答

双指针正确性的常见前提是( )。

(1 分)
第 40 题 F6 未作答

有序数组找「和为 target 的两个数」:暴力枚举与对撞双指针的对比是( )。

(1 分)
第 41 题 F7 未作答

对撞双指针中若当前两数之和小于目标,应该( )。

(1 分)

双指针应用

7 QUESTIONS · 2 POINTS EACH
第 42 题 G1 未作答

有序数组 {1, 3, 5, 7, 9, 11} 用对撞双指针找和为 1212 的数对,首先被找到的是( )。

(1 分)
第 43 题 G2 未作答

有序数组统计「不同值的个数」,双指针/一次扫描的做法是( )。

(1 分)
第 44 题 G3 未作答

「和不超过 kk 的最长连续子段」的滑动窗口做法是( )。

(1 分)
第 45 题 G4 未作答

固定大小为 kk 的窗口从左到右滑动求各窗和,「进一个出一个」的更新公式是( )。

(1 分)
第 46 题 G5 未作答

有序数组中「满足 a[l] + a[r] <= s 的对数」类问题适合对撞指针,是因为( )。

(1 分)
第 47 题 G6 未作答

合并两个有序数组的双指针做法是( )。

(1 分)
第 48 题 G7 未作答

「有序数组中相邻两个数的最大间隔」的最简求法是( )。

(1 分)

综合选择

6 QUESTIONS · 2 POINTS EACH
第 49 题 H1 未作答

前缀和与差分的配合模式是( )。

(1 分)
第 50 题 H2 未作答

「长度为 kk 的滑动窗各窗和」既可逐窗加减维护,也可用前缀和 pre[r] - pre[r-k] 查表,选择依据是( )。

(1 分)
第 51 题 H3 未作答

「先读完所有操作与查询、统一安排计算顺序」的思想(大纲未明列)称为( )。

(1 分)
第 52 题 H4 未作答

mm 次区间和查询,nn 个元素:逐项累加、前缀和、排序三种方案的复杂度正确的是( )。

(1 分)
第 53 题 H5 未作答

「给地面反复区间浇水和蒸发,最后问每块地的净水量」最适合( )。

(1 分)
第 54 题 H6 未作答

关于三大区间技术,正确的是( )。

(1 分)

一维前缀和代码

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

01int a[] = {0, 3, 1, 4, 1, 5};   // 下标 1..5 有效
02int pre[6] = {0};
03for (int i = 1; i <= 5; i++)
04    pre[i] = pre[i - 1] + a[i];
05for (int i = 1; i <= 5; i++) cout << pre[i] << " ";

输出是( )。

(1 分)
第 56 题 I2 未作答

数组 {3,1,4,1,5}(下标 1..5)的前缀和数组为 pre = {0,3,4,8,9,14}(pre[0]=0)。区间 [2,4][2,4] 的和 pre[4] - pre[1] 是( )。

(1 分)
第 57 题 I3 未作答

数组 {3,1,4,1,5},用前缀和分别回答「[1,3][1,3] 的和」与「[3,5][3,5] 的和」,结果是( )。

(1 分)
第 58 题 I4 未作答

数组 {-2, 3, -1} 的前缀和数组(下标 1 起,含 pre[0]=0)是( )。

(1 分)
第 59 题 I5 未作答

pre = {0, 3, 4, 8, 9, 14}(数组 {3,1,4,1,5})。pre[5] - pre[2] 对应哪个区间与结果( )。

(1 分)
第 60 题 I6 未作答

补全前缀和递推:

01pre[0] = 0;
02for (int i = 1; i <= n; i++)
03    pre[i] = /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)

差分代码

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

全零数组(下标 1..5)执行 [2,4] 每数加 33 的差分打点 d[2]+=3; d[5]-=3; 后前缀和还原,数组变为( )。

(1 分)
第 62 题 J2 未作答

全零数组执行两次区间加:[1,3][1,3]22[3,5][3,5]55,差分还原后数组(下标 1..6)是( )。

(1 分)
第 63 题 J3 未作答

全零数组执行 [2,4][2,4]77 后,位置 33 与位置 55 的值分别是( )。

(1 分)
第 64 题 J4 未作答

数组 {0, 5, 5, 8}(下标 1..3 为 5,5,85,5,8)的差分数组 d[1..3] 是(d[1]=a[1])是( )。

(1 分)
第 65 题 J5 未作答

补全差分还原(前缀和)循环:

01for (int i = 1; i <= n; i++)
02    b[i] = /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 66 题 J6 未作答

全零数组执行 [1,3][1,3]22[2,2][2,2]22,还原后数组(下标 1..4)是( )。

(1 分)
拾壹

二维前缀和代码

6 QUESTIONS · 2 POINTS EACH
第 67 题 K1 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}} 建二维前缀和(下标 1 起、行列 0 为零),s[3][3] 是( )。

(1 分)
第 68 题 K2 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}}(下标 1 起)的二维前缀和已建好。子阵 (2,2)(2,2)(3,3)(3,3)(右下角区域 {5,6,8,9}\{5,6,8,9\})的和 s[3][3]-s[1][3]-s[3][1]+s[1][1] 是( )。

(1 分)
第 69 题 K3 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}}(下标 1 起)中 s[1][3](第一行的前缀和)与 s[3][1](第一列的前缀和)分别是( )。

(1 分)
第 70 题 K4 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}}(下标 1 起)中 s[2][2](左上 2×22\times2 区域 {1,2,4,5}\{1,2,4,5\} 的和)是( )。

(1 分)
第 71 题 K5 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}}(下标 1 起)整个 3×33\times3 的元素和,用前缀和表示并求值是( )。

(1 分)
第 72 题 K6 未作答

补全二维前缀和递推:

01for (int i = 1; i <= n; i++)
02    for (int j = 1; j <= m; j++)
03        s[i][j] = s[i-1][j] + s[i][j-1] - /* 1 */ + a[i][j];

空位 /* 1 */ 处应填( )。

(1 分)
拾贰

双指针代码

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

01int a[] = {1, 3, 5, 7, 9, 11};
02int l = 0, r = 5;
03while (l < r) {
04    if (a[l] + a[r] == 12) { cout << a[l] << "," << a[r]; break; }
05    else if (a[l] + a[r] < 12) l++;
06    else r--;
07}

输出是( )。

(1 分)
第 74 题 L2 未作答

01int a[] = {1, 1, 2, 3, 3};
02int cnt = 0;
03for (int i = 0; i < 5; i++)
04    if (i == 0 || a[i] != a[i - 1]) cnt++;
05cout << cnt;

输出是( )。

(1 分)
第 75 题 L3 未作答

01int a[] = {1, 1, 2, 3, 3};
02int k = 0;
03for (int i = 0; i < 5; i++)
04    if (k == 0 || a[i] != a[k - 1]) a[k++] = a[i];
05for (int i = 0; i < k; i++) cout << a[i];

输出是( )。

(1 分)
第 76 题 L4 未作答

数组 {2, 3, 1, 5, 4},滑动窗口求「和不超过 88 的最长连续子段」,答案是( )。

(1 分)
第 77 题 L5 未作答

数组 {2, 3, 1, 5, 4} 滑窗(限和 88)推进到右端 r=3r=3(元素 55)时,窗口内发生了什么( )。

(1 分)
第 78 题 L6 未作答

有序 {2, 4, 6, 8, 10} 对撞找和为 1313 的数对。第一步(ll22rr1010,和 12<1312 < 13)与最终结果是( )。

(1 分)
拾叁

完善程序

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

补全前缀和递推(下标 1 起):

01pre[0] = 0;
02for (int i = 1; i <= n; i++)
03    pre[i] = /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 80 题 M2 未作答

补全区间 [l,r][l, r] 和的查表公式:

cout << /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 81 题 M3 未作答

补全区间 [l,r][l, r]vv 的差分打点:

d[l] += v;
/* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 82 题 M4 未作答

补全子阵 [(x1,y1),(x2,y2)][(x_1,y_1),(x_2,y_2)] 和的查表公式:

sum = s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 83 题 M5 未作答

补全「和不超过限值」滑窗的收缩循环:

01s += a[r];
02while (s > limit) {
03    /* 1 */;
04}

空位 /* 1 */ 处应填( )。

(1 分)
第 84 题 M6 未作答

补全有序数组两数之和找目标的双指针移动:

01int s = a[l] + a[r];
02if (s == target) { /* 找到 */ }
03else if (s < target) /* 1 */;
04else r--;

空位 /* 1 */ 处应填( )。

(1 分)
拾肆

综合代码

5 QUESTIONS · 2 POINTS EACH
第 85 题 N1 未作答

有序 {1, 3, 5} 用对撞双指针统计和为 66 的数对个数,答案是( )。

(1 分)
第 86 题 N2 未作答

数组 {2, -2, 3} 的前缀和数组为 pre = {0, 2, 0, 3}(pre[0]=0)。和为 00 的连续子段个数是( )。

(1 分)
第 87 题 N3 未作答

全零数组执行 [2,4][2,4]77 的差分打点后,不还原整个数组直接算位置 33 与位置 55 的值,分别是( )。

(1 分)
第 88 题 N4 未作答

数组 {-2, 3, -1, 2, -5} 用前缀和法(pre[j] 减历史最小前缀)求最大子段和,答案是( )。

(1 分)
第 89 题 N5 未作答

数组 {1, 4, 2, 10, 23, 3, 1},大小为 33 的窗口从左到右各窗之和依次是( )。

(1 分)
拾伍

综合应用

5 QUESTIONS · 2 POINTS EACH
第 90 题 O1 未作答

mm 次对区间 [l,r][l,r] 加值,最后输出整个数组」应选( )。

(1 分)
第 91 题 O2 未作答

「数组有多少个长度为 kk 的连续段平均值不低于 tt」最省事的组合是( )。

(1 分)
第 92 题 O3 未作答

「固定窗长 kk 的最大窗和」用前缀和的写法是( )。

(1 分)
第 93 题 O4 未作答

近年阅读真题出现过「排序去重后用双指针做分组统计」——其中「去重」步骤与双指针的配合是( )。

(1 分)
第 94 题 O5 未作答

nn 个元素:建前缀和、建差分、双指针扫描的复杂度分别是( )。

(1 分)
拾陆

易错排查

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

区间和公式误写成 pre[r] - pre[l],对「[2,4][2,4] 的和」的影响是( )。

(1 分)
第 96 题 P2 未作答

区间 [2,4][2,4]33 只写了 d[2] += 3; 忘了 d[5] -= 3;,还原后数组是( )。

(1 分)
第 97 题 P3 未作答

二维子阵和公式误写成全减(减去三个角不加回 s[x1-1][y1-1]),结果会( )。

(1 分)
第 98 题 P4 未作答

「和不超过 limit」滑窗的收缩条件误写成 while (s < limit),后果是( )。

(1 分)
第 99 题 P5 未作答

数组有 nn 个元素(下标 1..n1..n),pre 只开了 nn 位,后果是( )。

(1 分)
第 100 题 P6 未作答

关于前缀和、差分、双指针,正确的是( )。

(1 分)

真 题 演 练

1 QUESTIONS · 真题演练不计分
第 102~107 题 阅读程序 (共 0 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #define ll long long
5 
6  int n, k;
7  int a[200007];
8  int ans[200007];
9 
10  int main() {
11      scanf("%d%d", &n, &k);
12      for (int i = 1; i <= n; ++i) {
13          scanf("%d", &a[i]);
14      }
15      std::sort(a + 1, a + n + 1);
16      n = std::unique(a + 1, a + n + 1) - a - 1;
17      for (int i = 1, j = 0; i <= n; ++i) {
18          for (; j < i && a[i] - a[j + 1] > k; ++j)
19          ;
20          ans[i] = ans[j] + 1;
21      }
22      printf("%d\n", ans[n]);
23      return 0;
24  }

102.

当输入为 3 1 3 2 1 时,输出结果为 22。( )

103.

假设输入的 n 为正整数,输出的答案一定满足 n\le n1\ge 1。( )

104.

将第 1414 行的:

1  n = std::unique(a + 1, a + n + 1) - a - 1;

删除后,有可能出现与原本代码不同的输出结果。( )

105.

假设输入的 a 数组和 k 均为正整数,执行第 1818 行代码时,一定满足的条件 不包括( )。

106.

当输入为:n = 100, k = 2, a = {1, 2, ..., 100} 时,输出为( )。

107.

假设输入的 a 数组和 k 均为正整数,但 a 数组不一定有序,则若误删去第 1313 行的:

std::sort(a + 1, a + n + 1);

程序有可能出现的问题有( )。

CSP-J 2025 · 阅读程序 第22-27题 | 知识点 快速排序、二分查找、线性DP