林老师 · 客观题题库 · 第 27 章 线段树 · 知识细节练习

第 27 章 线段树 · 知识细节练习

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

判 分 报 告

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

线段树概念

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

线段树的定义是?

(1 分)
第 2 题 A2 未作答

线段树主要用于解决?

(1 分)
第 3 题 A3 未作答

nn 个元素做 qq 次区间查询,暴力 O(nq)O(nq);线段树是?

(1 分)
第 4 题 A4 未作答

nn 个元素的线段树通常开多大数组?

(1 分)
第 5 题 A5 未作答

线段树中每个非叶节点的区间如何划分给孩子?

(1 分)
第 6 题 A6 未作答

判断题:线段树、树状数组、ST 表都能处理区间查询——但线段树功能最强(支持区间修改),代码量也最大。

(1 分)

建树与查询

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

build 建树的过程是?

(1 分)
第 8 题 B2 未作答

判断题:pushup 是"用左右孩子的值更新父节点"——区间和树 pushup = 左和 + 右和,最值树 pushup = max(左, 右)。

(1 分)
第 9 题 B3 未作答

线段树区间查询的三种情况是?

(1 分)
第 10 题 B4 未作答

线段树单次区间查询的时间复杂度是?

(1 分)
第 11 题 B5 未作答

线段树单点修改的过程是?

(1 分)
第 12 题 B6 未作答

数组 {1, 3, 5, 7}(下标 1 起),区间 [2,3][2, 3] 的和是?

(1 分)
第 13 题 B7 未作答

线段树建树的时间复杂度是?

(1 分)

区间修改与 lazy

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

判断题:不用 lazy 直接递归到每个叶子做区间修改,单次 O(n)O(n)——qq 次就是 O(nq)O(nq),与暴力无异,必须用 lazy 优化。

(1 分)
第 15 题 C2 未作答

lazy 标记的核心思想是?

(1 分)
第 16 题 C3 未作答

pushdown 的作用是?

(1 分)
第 17 题 C4 未作答

判断题:带 lazy 的区间修改——完全覆盖时更新节点值并累加标记;部分相交时先 pushdown 再递归修改,最后 pushup。

(1 分)
第 18 题 C5 未作答

判断题:带 lazy 的区间查询,进入部分相交的孩子前必须先 pushdown——否则孩子值是"过期"的。

(1 分)
第 19 题 C6 未作答

判断题:多次区间加可以合并成一个 lazy 标记(累加)——同一节点的标记叠加不破坏正确性。

(1 分)
第 20 题 C7 未作答

带 lazy 的区间修改单次复杂度是?

(1 分)

线段树实现细节

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

线段树数组开 4n4n 的原因是?

(1 分)
第 22 题 D2 未作答

线段树常用下标 1 起,根为 1,左右孩子是?

(1 分)
第 23 题 D3 未作答

区间 [l,r][l, r] 的中点 mid 的标准写法是?

(1 分)
第 24 题 D4 未作答

build/单点修改递归的出口条件是?

(1 分)
第 25 题 D5 未作答

查询区间 [ql,qr][ql, qr] 完全覆盖节点区间 [l,r][l, r] 的判断是?

(1 分)
第 26 题 D6 未作答

部分相交时递归左孩子的条件是?

(1 分)
第 27 题 D7 未作答

判断题:线段树数组下标与区间一一对应——节点 kk 存区间 [l,r][l, r] 的值,kk 由递归参数确定。

(1 分)

线段树应用

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

线段树求区间最大值:叶子存元素值,pushup 是?

(1 分)
第 29 题 E2 未作答

线段树求区间和:查询不相交时返回的中性值是?

(1 分)
第 30 题 E3 未作答

判断题:区间加用 lazy——完全覆盖时 tree[k] += x × 区间长度lazy[k] += x

(1 分)
第 31 题 E4 未作答

区间覆盖(全部赋值为 x)与区间加的区别是?

(1 分)
第 32 题 E5 未作答

判断题:同时支持区间加与区间乘时,需要两个 lazy 标记(加法标记与乘法标记),下传时按"先乘后加"的顺序更新。

(1 分)
第 33 题 E6 未作答

判断题:线段树应用总表——区间和/区间最值/区间加/区间覆盖/区间乘、扫描线求面积、权值线段树求第 k 小。

(1 分)

线段树变体

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

动态开点线段树解决什么问题?

(1 分)
第 35 题 F2 未作答

判断题:值域大但元素少时先离散化(把值映射到 1n1 \sim n 的排名),再建线段树——压缩值域。

(1 分)
第 36 题 F3 未作答

权值线段树是?

(1 分)
第 37 题 F4 未作答

判断题:可持久化线段树(主席树)保存每次修改的历史版本——新版本共享未修改的节点。

(1 分)
第 38 题 F5 未作答

判断题:线段树合并 = 两棵线段树对应节点合并(如统计和)——用于树上统计等场景。

(1 分)
第 39 题 F6 未作答

判断题:线段树变体总表——动态开点(大值域)、离散化(稀疏值域)、权值线段树(第 k 小)、可持久化(历史版本)、合并(树上统计)。

(1 分)

线段树与其他结构

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

线段树与树状数组的对比,正确的是?

(1 分)
第 41 题 G2 未作答

线段树与 ST 表的对比,正确的是?

(1 分)
第 42 题 G3 未作答

判断题:分块是线段树的"平替"——实现简单、复杂度 O(n)O(\sqrt{n}),小数据下常比线段树好写。

(1 分)
第 43 题 G4 未作答

需要区间加 + 区间求和,最佳选择是?

(1 分)
第 44 题 G5 未作答

判断题:复杂度对比——线段树建树 O(n)O(n)、查询/修改 O(logn)O(\log n);树状数组 O(logn)O(\log n);ST 表建表 O(nlogn)O(n \log n)、查询 O(1)O(1)(静态)。

(1 分)
第 45 题 G6 未作答

判断题:选择依据——要修改选线段树/树状数组;只查询最值且静态选 ST 表;求第 k 小选权值线段树;值域大用离散化/动态开点。

(1 分)

易错综合

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

判断题:区间修改打了 lazy 后,查询/修改进入子区间前必须 pushdown——忘下传会读到过期的孩子值。

(1 分)
第 47 题 H2 未作答

判断题:线段树数组开 2n2n 可能不够(最坏接近 4n4n 节点)——开小会越界产生未定义行为。

(1 分)
第 48 题 H3 未作答

判断题:完全覆盖判断 ql <= l && r <= qr 与"节点被查询区间包含"——写成反向(节点包含查询区间)是经典错误。

(1 分)
第 49 题 H4 未作答

判断题:修改/下传后忘了 pushup 会导致父节点值不更新——查询结果错误且难排查。

(1 分)
第 50 题 H5 未作答

判断题:以下结论全部正确——"线段树节点 ≤ 4n;查询三分支;lazy 延迟下传;部分相交递归前先 pushdown、返回前 pushup;下标 1 起孩子 2k/2k+1"。

(1 分)

建树与结构代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 5;
05    cout << 4 * n;         // 线段树数组安全大小
06    return 0;
07}

单选题:程序输出是?

(1 分)
第 52 题 I2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};   // 下标 1~4
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];   // pushup:区间和
11}
12int main() {
13    build(1, 1, 4);
14    for (int i = 1; i <= 7; i++) cout << tree[i] << " ";
15    return 0;
16}

单选题:程序输出是?(节点 1~7 的值,即整棵树)

(1 分)
第 53 题 I3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int k = 2;                       // 某节点下标
05    cout << 2 * k << " " << 2 * k + 1 << " " << k / 2;
06    return 0;
07}

单选题:程序输出是?(节点 2 的左右孩子与父节点下标)

(1 分)
第 54 题 I4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int left = 4, right = 12;        // 左右孩子的值(区间和)
05    cout << left + right;            // pushup:求和
06    return 0;
07}

单选题:程序输出是?(父节点 = 左 + 右)

(1 分)
第 55 题 I5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (______) { tree[k] = a[l]; return; }   // 叶子出口
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12int main() {
13    build(1, 1, 4);
14    cout << tree[1];
15    return 0;
16}

单选题:横线处应填入?(使输出为 16

(1 分)
第 56 题 I6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    // 区间 [1, 4] 的线段树:叶子 4 个,非叶 3 个,共 7 个节点
05    cout << 7;
06    return 0;
07}

单选题:程序输出是?(4 个元素恰为 2 的幂时节点数 = 2n - 1 = 7)

(1 分)

查询代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12int query(int k, int l, int r, int ql, int qr) {
13    if (ql <= l && r <= qr) return tree[k];              // 完全覆盖
14    if (qr < l || r < ql) return 0;                      // 不相交
15    int mid = (l + r) >> 1;
16    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
17}
18int main() {
19    build(1, 1, 4);
20    cout << query(1, 1, 4, 2, 3);
21    return 0;
22}

单选题:程序输出是?(区间 [2,3] 的和)

(1 分)
第 58 题 J2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = max(tree[2 * k], tree[2 * k + 1]);   // 最值版 pushup
11}
12int query(int k, int l, int r, int ql, int qr) {
13    if (ql <= l && r <= qr) return tree[k];
14    if (qr < l || r < ql) return 0;
15    int mid = (l + r) >> 1;
16    return max(query(2 * k, l, mid, ql, qr), query(2 * k + 1, mid + 1, r, ql, qr));
17}
18int main() {
19    build(1, 1, 4);
20    cout << query(1, 1, 4, 2, 4);
21    return 0;
22}

单选题:程序输出是?(区间 [2,4] 的最大值)

(1 分)
第 59 题 J3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int ql, int qr) {
05    if (ql <= l && r <= qr) { cout << "C"; return tree[k]; }   // 完全覆盖
06    if (qr < l || r < ql) { cout << "N"; return 0; }           // 不相交
07    cout << "P";                                                // 部分相交
08    int mid = (l + r) >> 1;
09    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
10}
11int main() {
12    cout << query(1, 1, 4, 2, 3) << " ";
13    return 0;
14}

单选题:程序输出是?(查询 [2,3] 访问节点的类型序列:根 P → 左 P → 左叶 N → 右叶 C → 右 P → 左叶 C → 右叶 N)

(1 分)
第 60 题 J4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int p) {
05    if (l == r) return tree[k];
06    int mid = (l + r) >> 1;
07    if (p <= mid) return query(2 * k, l, mid, p);
08    else return query(2 * k + 1, mid + 1, r, p);
09}
10int main() {
11    cout << query(1, 1, 4, 3);
12    return 0;
13}

单选题:程序输出是?(第 3 个元素的值)

(1 分)
第 61 题 J5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int ql, int qr) {
05    if (______) return tree[k];              // 完全覆盖
06    if (qr < l || r < ql) return 0;
07    int mid = (l + r) >> 1;
08    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
09}
10int main() {
11    cout << query(1, 1, 4, 3, 4);
12    return 0;
13}

单选题:横线处应填入?(使输出为 12

(1 分)
第 62 题 J6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int ql, int qr) {
05    if (ql <= l && r <= qr) return tree[k];
06    if (qr < l || r < ql) return 0;
07    int mid = (l + r) >> 1;
08    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
09}
10int main() {
11    cout << query(1, 1, 4, 1, 4) << " " << query(1, 1, 4, 2, 4);
12    return 0;
13}

单选题:程序输出是?([1,4] 全区间与 [2,4] 的和)

(1 分)
拾壹

单点修改代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int p, int v) {
13    if (l == r) { tree[k] += v; return; }       // 叶子:值 += v
14    int mid = (l + r) >> 1;
15    if (p <= mid) update(2 * k, l, mid, p, v);
16    else update(2 * k + 1, mid + 1, r, p, v);
17    tree[k] = tree[2 * k] + tree[2 * k + 1];    // 回溯 pushup
18}
19int main() {
20    build(1, 1, 4);
21    update(1, 1, 4, 2, 2);     // a[2] += 2 → 3 变 5
22    cout << tree[1];
23    return 0;
24}

单选题:程序输出是?(修改后的总和)

(1 分)
第 64 题 K2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 18, 6, 12, 1, 5, 5, 7};   // a[2] 已 +2 后的树
04int query(int k, int l, int r, int ql, int qr) {
05    if (ql <= l && r <= qr) return tree[k];
06    if (qr < l || r < ql) return 0;
07    int mid = (l + r) >> 1;
08    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
09}
10int main() {
11    cout << query(1, 1, 4, 1, 2);
12    return 0;
13}

单选题:程序输出是?(修改后 [1,2] 的和 = 1 + 5)

(1 分)
第 65 题 K3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int p, int v) {
13    cout << k << " ";                            // 打印访问的节点
14    if (l == r) { tree[k] += v; return; }
15    int mid = (l + r) >> 1;
16    if (p <= mid) update(2 * k, l, mid, p, v);
17    else update(2 * k + 1, mid + 1, r, p, v);
18    tree[k] = tree[2 * k] + tree[2 * k + 1];
19}
20int main() {
21    build(1, 1, 4);
22    update(1, 1, 4, 2, 2);
23    return 0;
24}

单选题:程序输出是?(修改 a[2] 时访问的节点路径)

(1 分)
第 66 题 K4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04void update(int k, int l, int r, int p, int v) {
05    if (l == r) { tree[k] += v; return; }
06    int mid = (l + r) >> 1;
07    if (______) update(2 * k, l, mid, p, v);    // 目标在左半
08    else update(2 * k + 1, mid + 1, r, p, v);
09    tree[k] = tree[2 * k] + tree[2 * k + 1];
10}
11int main() {
12    update(1, 1, 4, 3, 1);     // a[3] += 1 → 5 变 6
13    cout << tree[1];
14    return 0;
15}

单选题:横线处应填入?(使输出为 17

(1 分)
第 67 题 K5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int p, int v) {
13    if (l == r) { tree[k] += v; return; }
14    int mid = (l + r) >> 1;
15    if (p <= mid) update(2 * k, l, mid, p, v);
16    else update(2 * k + 1, mid + 1, r, p, v);
17    tree[k] = tree[2 * k] + tree[2 * k + 1];
18}
19int query(int k, int l, int r, int ql, int qr) {
20    if (ql <= l && r <= qr) return tree[k];
21    if (qr < l || r < ql) return 0;
22    int mid = (l + r) >> 1;
23    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
24}
25int main() {
26    build(1, 1, 4);
27    update(1, 1, 4, 1, 10);    // a[1] = 11
28    cout << query(1, 1, 4, 1, 4);
29    return 0;
30}

单选题:程序输出是?(a[1] 加 10 后总和)

(1 分)
第 68 题 K6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int p, int v) {
13    if (l == r) { tree[k] += v; return; }
14    int mid = (l + r) >> 1;
15    if (p <= mid) update(2 * k, l, mid, p, v);
16    else update(2 * k + 1, mid + 1, r, p, v);
17    tree[k] = tree[2 * k] + tree[2 * k + 1];
18}
19int main() {
20    build(1, 1, 4);
21    update(1, 1, 4, 2, 2);    // a[2] = 5
22    update(1, 1, 4, 4, 3);    // a[4] = 10
23    cout << tree[1];
24    return 0;
25}

单选题:程序输出是?(两次修改后总和 = 1+5+5+10)

(1 分)
第 69 题 K7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int p, int v) {
13    if (l == r) { tree[k] += v; return; }
14    int mid = (l + r) >> 1;
15    if (p <= mid) update(2 * k, l, mid, p, v);
16    else update(2 * k + 1, mid + 1, r, p, v);
17    tree[k] = tree[2 * k] + tree[2 * k + 1];
18}
19int main() {
20    build(1, 1, 4);
21    update(1, 1, 4, 3, -2);   // a[3] = 3
22    cout << tree[3] << " " << tree[1];
23    return 0;
24}

单选题:程序输出是?(右子树和与总和)

(1 分)
拾贰

区间修改 lazy 代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20], lazy[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int ql, int qr, int v) {
13    if (ql <= l && r <= qr) {                // 完全覆盖:打 lazy
14        tree[k] += v * (r - l + 1);
15        lazy[k] += v;
16        return;
17    }
18    int mid = (l + r) >> 1;
19    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
20    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
21    tree[k] = tree[2 * k] + tree[2 * k + 1];
22}
23int main() {
24    build(1, 1, 4);
25    update(1, 1, 4, 1, 2, 2);     // [1,2] 每个 +2
26    cout << tree[1];
27    return 0;
28}

单选题:程序输出是?(区间 [1,2] +2 后总和 = 16 + 4)

(1 分)
第 71 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 20, 8, 12, 1, 3, 5, 7};
04int lazy[20] = {0, 0, 2, 0, 0, 0, 0, 0};    // 节点 2 带 lazy +2
05void pushdown(int k, int l, int r) {
06    if (!lazy[k]) return;
07    int mid = (l + r) >> 1;
08    tree[2 * k] += lazy[k] * (mid - l + 1);
09    lazy[2 * k] += lazy[k];
10    tree[2 * k + 1] += lazy[k] * (r - mid);
11    lazy[2 * k + 1] += lazy[k];
12    lazy[k] = 0;
13}
14int main() {
15    pushdown(2, 1, 2);
16    cout << tree[4] << " " << tree[5] << " " << lazy[2];
17    return 0;
18}

单选题:程序输出是?(下传后两个叶子值与节点 2 的 lazy)

(1 分)
第 72 题 L3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20], lazy[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void pushdown(int k, int l, int r) {
13    if (!lazy[k]) return;
14    int mid = (l + r) >> 1;
15    tree[2 * k] += lazy[k] * (mid - l + 1);
16    lazy[2 * k] += lazy[k];
17    tree[2 * k + 1] += lazy[k] * (r - mid);
18    lazy[2 * k + 1] += lazy[k];
19    lazy[k] = 0;
20}
21void update(int k, int l, int r, int ql, int qr, int v) {
22    if (ql <= l && r <= qr) { tree[k] += v * (r - l + 1); lazy[k] += v; return; }
23    pushdown(k, l, r);
24    int mid = (l + r) >> 1;
25    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
26    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
27    tree[k] = tree[2 * k] + tree[2 * k + 1];
28}
29int query(int k, int l, int r, int ql, int qr) {
30    if (ql <= l && r <= qr) return tree[k];
31    pushdown(k, l, r);
32    int mid = (l + r) >> 1;
33    int res = 0;
34    if (ql <= mid) res += query(2 * k, l, mid, ql, qr);
35    if (mid < qr) res += query(2 * k + 1, mid + 1, r, ql, qr);
36    return res;
37}
38int main() {
39    build(1, 1, 4);
40    update(1, 1, 4, 1, 2, 2);     // [1,2] +2
41    cout << query(1, 1, 4, 1, 1); // 查 [1,1](触发 pushdown)
42    return 0;
43}

单选题:程序输出是?(a[1] 加 2 后 = 3)

(1 分)
第 73 题 L4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20], lazy[20];
04void update(int k, int l, int r, int ql, int qr, int v) {
05    if (ql <= l && r <= qr) {
06        tree[k] += v * (r - l + 1);
07        ______;                       // 累加 lazy 标记
08        return;
09    }
10    int mid = (l + r) >> 1;
11    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
12    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
13    tree[k] = tree[2 * k] + tree[2 * k + 1];
14}
15int main() {
16    // 已建好的树 {0,16,4,12,1,3,5,7},区间 [3,4] +1
17    int a[5] = {0, 1, 3, 5, 7};
18    // 略去 build(直接给出树值)
19    tree[1] = 16; tree[2] = 4; tree[3] = 12; tree[4] = 1; tree[5] = 3; tree[6] = 5; tree[7] = 7;
20    update(1, 1, 4, 3, 4, 1);
21    cout << tree[1];
22    return 0;
23}

单选题:横线处应填入?(使输出为 18

(1 分)
第 74 题 L5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20], cov[20];           // cov = 覆盖标记(-1 表示无标记)
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void assign(int k, int l, int r, int ql, int qr, int v) {
13    if (ql <= l && r <= qr) {
14        tree[k] = v * (r - l + 1);   // 赋值:值 = v × 长度
15        cov[k] = v;
16        return;
17    }
18    int mid = (l + r) >> 1;
19    if (ql <= mid) assign(2 * k, l, mid, ql, qr, v);
20    if (mid < qr) assign(2 * k + 1, mid + 1, r, ql, qr, v);
21    tree[k] = tree[2 * k] + tree[2 * k + 1];
22}
23int main() {
24    build(1, 1, 4);
25    assign(1, 1, 4, 3, 4, 0);      // [3,4] 全部赋值为 0
26    cout << tree[1];
27    return 0;
28}

单选题:程序输出是?([3,4] 清零后总和 = 1 + 3 + 0 + 0)

(1 分)
第 75 题 L6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20], lazy[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void pushdown(int k, int l, int r) {
13    if (!lazy[k]) return;
14    int mid = (l + r) >> 1;
15    tree[2 * k] += lazy[k] * (mid - l + 1);
16    lazy[2 * k] += lazy[k];
17    tree[2 * k + 1] += lazy[k] * (r - mid);
18    lazy[2 * k + 1] += lazy[k];
19    lazy[k] = 0;
20}
21void update(int k, int l, int r, int ql, int qr, int v) {
22    if (ql <= l && r <= qr) { tree[k] += v * (r - l + 1); lazy[k] += v; return; }
23    pushdown(k, l, r);
24    int mid = (l + r) >> 1;
25    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
26    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
27    tree[k] = tree[2 * k] + tree[2 * k + 1];
28}
29int query(int k, int l, int r, int ql, int qr) {
30    if (ql <= l && r <= qr) return tree[k];
31    pushdown(k, l, r);
32    int mid = (l + r) >> 1;
33    int res = 0;
34    if (ql <= mid) res += query(2 * k, l, mid, ql, qr);
35    if (mid < qr) res += query(2 * k + 1, mid + 1, r, ql, qr);
36    return res;
37}
38int main() {
39    build(1, 1, 4);
40    update(1, 1, 4, 1, 2, 2);      // [1,2] +2
41    update(1, 1, 4, 2, 3, 1);      // [2,3] +1(跨节点,触发 pushdown)
42    cout << query(1, 1, 4, 2, 2);
43    return 0;
44}

单选题:程序输出是?(a[2] = 3 + 2 + 1 = 6)

(1 分)
拾叁

区间修改实战代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 1, 2, 3, 4, 5};
04int tree[24], lazy[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void pushdown(int k, int l, int r) {
13    if (!lazy[k]) return;
14    int mid = (l + r) >> 1;
15    tree[2 * k] += lazy[k] * (mid - l + 1);
16    lazy[2 * k] += lazy[k];
17    tree[2 * k + 1] += lazy[k] * (r - mid);
18    lazy[2 * k + 1] += lazy[k];
19    lazy[k] = 0;
20}
21void update(int k, int l, int r, int ql, int qr, int v) {
22    if (ql <= l && r <= qr) { tree[k] += v * (r - l + 1); lazy[k] += v; return; }
23    pushdown(k, l, r);
24    int mid = (l + r) >> 1;
25    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
26    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
27    tree[k] = tree[2 * k] + tree[2 * k + 1];
28}
29int query(int k, int l, int r, int ql, int qr) {
30    if (ql <= l && r <= qr) return tree[k];
31    pushdown(k, l, r);
32    int mid = (l + r) >> 1;
33    int res = 0;
34    if (ql <= mid) res += query(2 * k, l, mid, ql, qr);
35    if (mid < qr) res += query(2 * k + 1, mid + 1, r, ql, qr);
36    return res;
37}
38int main() {
39    build(1, 1, 5);
40    update(1, 1, 5, 1, 3, 2);     // [1,3] +2 → 6、9
41    update(1, 1, 5, 2, 4, 1);     // [2,4] +1 → 6、5、7
42    cout << query(1, 1, 5, 1, 5);
43    return 0;
44}

单选题:程序输出是?(最终数组 {3,5,6,5,5} 的总和)

(1 分)
第 77 题 M2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 1, 2, 3, 4, 5};
04int tree[24], lazy[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = max(tree[2 * k], tree[2 * k + 1]);
11}
12void pushdown(int k) {
13    if (!lazy[k]) return;
14    tree[2 * k] += lazy[k]; lazy[2 * k] += lazy[k];
15    tree[2 * k + 1] += lazy[k]; lazy[2 * k + 1] += lazy[k];
16    lazy[k] = 0;
17}
18void update(int k, int l, int r, int ql, int qr, int v) {
19    if (ql <= l && r <= qr) { tree[k] += v; lazy[k] += v; return; }
20    pushdown(k);
21    int mid = (l + r) >> 1;
22    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
23    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
24    tree[k] = max(tree[2 * k], tree[2 * k + 1]);
25}
26int query(int k, int l, int r, int ql, int qr) {
27    if (ql <= l && r <= qr) return tree[k];
28    pushdown(k);
29    int mid = (l + r) >> 1;
30    int res = 0;
31    if (ql <= mid) res = max(res, query(2 * k, l, mid, ql, qr));
32    if (mid < qr) res = max(res, query(2 * k + 1, mid + 1, r, ql, qr));
33    return res;
34}
35int main() {
36    build(1, 1, 5);
37    update(1, 1, 5, 1, 3, 2);     // [1,3] +2 → {3,4,5,4,5}
38    cout << query(1, 1, 5, 1, 5);
39    return 0;
40}

单选题:程序输出是?(修改后的全局最大值)

(1 分)
第 78 题 M3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    // 区间加与区间乘两个 lazy:先乘后加的顺序
05    // 节点值 v,乘标记 mul,加标记 add
06    // 乘 x 时:v = v*x, mul = mul*x, add = add*x
07    // 加 x 时:v = v+x*len, add += x
08    int v = 5, mul = 2, add = 3;
09    v = v * mul + add * 1;       // 模拟"先乘后加"后的值(长度为 1)
10    cout << v;
11    return 0;
12}

单选题:程序输出是?(5 × 2 + 3)

(1 分)
第 79 题 M4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[24], lazy[24];
04void pushdown(int k, int l, int r) {
05    if (!lazy[k]) return;
06    int mid = (l + r) >> 1;
07    tree[2 * k] += lazy[k] * (mid - l + 1);
08    lazy[2 * k] += lazy[k];
09    tree[2 * k + 1] += lazy[k] * ______;   // 右孩子长度
10    lazy[2 * k + 1] += lazy[k];
11    lazy[k] = 0;
12}
13int main() {
14    // 验证 pushdown:节点区间 [1,4],lazy = 3
15    tree[2] = 10; tree[3] = 20; lazy[1] = 3;
16    pushdown(1, 1, 4);
17    cout << tree[2] << " " << tree[3] << " " << lazy[1];
18    return 0;
19}

单选题:横线处应填入?(使输出为 16 26 0——左右各加 3×2)

(1 分)
第 80 题 M5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20], lazy[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void update(int k, int l, int r, int ql, int qr, int v) {
13    if (ql <= l && r <= qr) { tree[k] += v * (r - l + 1); lazy[k] += v; return; }
14    int mid = (l + r) >> 1;
15    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
16    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
17    tree[k] = tree[2 * k] + tree[2 * k + 1];
18}
19int main() {
20    build(1, 1, 4);
21    update(1, 1, 4, 4, 4, 3);     // 只改 [4,4](右边界)
22    cout << tree[1];
23    return 0;
24}

单选题:程序输出是?(a[4] +3 后总和 = 16 + 3)

(1 分)
第 81 题 M6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 2, 4, 6, 8, 10};
04int tree[24], lazy[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12void pushdown(int k, int l, int r) {
13    if (!lazy[k]) return;
14    int mid = (l + r) >> 1;
15    tree[2 * k] += lazy[k] * (mid - l + 1);
16    lazy[2 * k] += lazy[k];
17    tree[2 * k + 1] += lazy[k] * (r - mid);
18    lazy[2 * k + 1] += lazy[k];
19    lazy[k] = 0;
20}
21void update(int k, int l, int r, int ql, int qr, int v) {
22    if (ql <= l && r <= qr) { tree[k] += v * (r - l + 1); lazy[k] += v; return; }
23    pushdown(k, l, r);
24    int mid = (l + r) >> 1;
25    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
26    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
27    tree[k] = tree[2 * k] + tree[2 * k + 1];
28}
29int query(int k, int l, int r, int ql, int qr) {
30    if (ql <= l && r <= qr) return tree[k];
31    pushdown(k, l, r);
32    int mid = (l + r) >> 1;
33    int res = 0;
34    if (ql <= mid) res += query(2 * k, l, mid, ql, qr);
35    if (mid < qr) res += query(2 * k + 1, mid + 1, r, ql, qr);
36    return res;
37}
38int main() {
39    build(1, 1, 5);              // {2,4,6,8,10} 和 30
40    update(1, 1, 5, 2, 4, 1);    // [2,4] +1 → {2,5,7,9,10}
41    cout << query(1, 1, 5, 3, 5);
42    return 0;
43}

单选题:程序输出是?([3,5] 的和 = 7 + 9 + 10)

(1 分)
拾肆

应用代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 1, 2, 3, 4, 5};
04int tree[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12int query(int k, int l, int r, int ql, int qr) {
13    if (ql <= l && r <= qr) return tree[k];
14    if (qr < l || r < ql) return 0;
15    int mid = (l + r) >> 1;
16    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
17}
18int main() {
19    build(1, 1, 5);
20    cout << query(1, 1, 5, 2, 4);
21    return 0;
22}

单选题:程序输出是?([2,4] 的和 = 2+3+4)

(1 分)
第 83 题 N2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 3, 1, 4, 1, 5};
04int tree[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = max(tree[2 * k], tree[2 * k + 1]);
11}
12int query(int k, int l, int r, int ql, int qr) {
13    if (ql <= l && r <= qr) return tree[k];
14    if (qr < l || r < ql) return 0;
15    int mid = (l + r) >> 1;
16    return max(query(2 * k, l, mid, ql, qr), query(2 * k + 1, mid + 1, r, ql, qr));
17}
18int main() {
19    build(1, 1, 5);
20    cout << query(1, 1, 5, 1, 4);
21    return 0;
22}

单选题:程序输出是?([1,4] 的最大值)

(1 分)
第 84 题 N3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[3] = {100, 5, 99999};
05    int b[3];
06    for (int i = 0; i < 3; i++) b[i] = a[i];
07    sort(b, b + 3);                       // {5, 100, 99999}
08    for (int i = 0; i < 3; i++) {
09        // 每个数的排名(1 起)
10        cout << lower_bound(b, b + 3, a[i]) - b + 1 << " ";
11    }
12    return 0;
13}

单选题:程序输出是?(离散化后的排名)

(1 分)
第 85 题 N4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    // 权值线段树思想:从左到右插入 a[i],统计已插入中 > a[i] 的个数
05    int a[4] = {3, 1, 4, 2};
06    long long cnt = 0;
07    for (int i = 0; i < 4; i++) {
08        for (int j = 0; j < i; j++)
09            if (a[j] > a[i]) cnt++;       // 朴素版:每步查前面更大的
10    }
11    cout << cnt;
12    return 0;
13}

单选题:程序输出是?({3,1,4,2} 的逆序对:{3,1}、{3,2}、{4,2})

(1 分)
第 86 题 N5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 1, 2, 3, 4, 5};
04int tree[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = ______;                // 区间和的 pushup
11}
12int main() {
13    build(1, 1, 5);
14    cout << tree[1];
15    return 0;
16}

单选题:横线处应填入?(使输出为 15

(1 分)
第 87 题 N6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {0, 5, 2, 8, 1, 9};
04int tree[24];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = max(tree[2 * k], tree[2 * k + 1]);
11}
12int query(int k, int l, int r, int ql, int qr) {
13    if (ql <= l && r <= qr) return tree[k];
14    if (qr < l || r < ql) return 0;
15    int mid = (l + r) >> 1;
16    return max(query(2 * k, l, mid, ql, qr), query(2 * k + 1, mid + 1, r, ql, qr));
17}
18int main() {
19    build(1, 1, 5);
20    cout << query(1, 1, 5, 2, 5);
21    return 0;
22}

单选题:程序输出是?([2,5] 的最大值 = max(2,8,1,9))

(1 分)
拾伍

完善程序

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

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { ______; return; }        // 叶子取值
07    int mid = (l + r) >> 1;
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12int main() {
13    build(1, 1, 4);
14    cout << tree[1];
15    return 0;
16}

单选题:横线处应填入?(使输出为 16

(1 分)
第 89 题 O2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int ql, int qr) {
05    if (ql <= l && r <= qr) return tree[k];
06    if (______) return 0;                // 完全不相交
07    int mid = (l + r) >> 1;
08    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
09}
10int main() {
11    cout << query(1, 1, 4, 1, 2);
12    return 0;
13}

单选题:横线处应填入?(使输出为 4

(1 分)
第 90 题 O3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20], lazy[20];
04void pushdown(int k, int l, int r) {
05    if (!lazy[k]) return;
06    int mid = (l + r) >> 1;
07    tree[2 * k] += lazy[k] * (mid - l + 1);
08    lazy[2 * k] += lazy[k];
09    tree[2 * k + 1] += lazy[k] * (r - mid);
10    lazy[2 * k + 1] += lazy[k];
11    ______;                      // 清空父标记
12}
13int main() {
14    tree[2] = 10; tree[3] = 20; lazy[1] = 3;
15    pushdown(1, 1, 4);
16    cout << lazy[1];
17    return 0;
18}

单选题:横线处应填入?(使输出为 0

(1 分)
第 91 题 O4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20], lazy[20];
04void update(int k, int l, int r, int ql, int qr, int v) {
05    if (ql <= l && r <= qr) {
06        tree[k] += v * (r - l + 1);
07        lazy[k] += v;
08        ______;                       // 完全覆盖直接返回
09    }
10    int mid = (l + r) >> 1;
11    if (ql <= mid) update(2 * k, l, mid, ql, qr, v);
12    if (mid < qr) update(2 * k + 1, mid + 1, r, ql, qr, v);
13    tree[k] = tree[2 * k] + tree[2 * k + 1];
14}
15int main() {
16    tree[1] = 16; tree[2] = 4; tree[3] = 12; tree[4] = 1; tree[5] = 3; tree[6] = 5; tree[7] = 7;
17    update(1, 1, 4, 1, 2, 2);
18    cout << tree[1];
19    return 0;
20}

单选题:横线处应填入?(使输出为 20

(1 分)
第 92 题 O5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04void update(int k, int l, int r, int p, int v) {
05    if (l == r) { tree[k] += v; return; }
06    int mid = (l + r) >> 1;
07    if (p <= mid) update(2 * k, l, mid, p, v);
08    else update(2 * k + 1, mid + 1, r, p, v);
09    ______;                     // 回溯更新父节点
10}
11int main() {
12    update(1, 1, 4, 2, 2);
13    cout << tree[1];
14    return 0;
15}

单选题:横线处应填入?(使输出为 18

(1 分)
第 93 题 O6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[24];
04void build(int k, int l, int r) {
05    if (l == r) { tree[k] = 1; return; }   // 每个位置初始为 1
06    int mid = (l + r) >> 1;
07    build(2 * k, l, mid);
08    build(2 * k + 1, mid + 1, r);
09    tree[k] = tree[2 * k] + tree[2 * k + 1];
10}
11int query(int k, int l, int r, int ql, int qr) {
12    if (ql <= l && r <= qr) return tree[k];
13    if (qr < l || r < ql) return 0;
14    int mid = (l + r) >> 1;
15    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
16}
17int main() {
18    build(1, 1, 6);
19    cout << query(1, 1, 6, ______);
20    return 0;
21}

单选题:横线处应填入?(统计 [2,5] 中"有效位置"的个数,使输出为 4

(1 分)
第 94 题 O7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 1, 3, 5, 7};
04int tree[20];
05void build(int k, int l, int r) {
06    if (l == r) { tree[k] = a[l]; return; }
07    int mid = ______;                    // 中点
08    build(2 * k, l, mid);
09    build(2 * k + 1, mid + 1, r);
10    tree[k] = tree[2 * k] + tree[2 * k + 1];
11}
12int main() {
13    build(1, 1, 4);
14    cout << tree[1];
15    return 0;
16}

单选题:横线处应填入?(使输出为 16

(1 分)
拾陆

代码易错

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

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20], lazy[20];
04int query(int k, int l, int r, int ql, int qr) {
05    if (ql <= l && r <= qr) return tree[k];
06    // 错误:部分相交时忘了 pushdown(k, l, r)
07    int mid = (l + r) >> 1;
08    int res = 0;
09    if (ql <= mid) res += query(2 * k, l, mid, ql, qr);
10    if (mid < qr) res += query(2 * k + 1, mid + 1, r, ql, qr);
11    return res;
12}
13int main() {
14    // 节点 2 区间 [1,2] 带 lazy +2(tree[2] 已更新为 8,但孩子 4、5 还是旧值 1、3)
15    tree[1] = 20; tree[2] = 8; tree[3] = 12; tree[4] = 1; tree[5] = 3; tree[6] = 5; tree[7] = 7;
16    lazy[2] = 2;
17    cout << query(1, 1, 4, 1, 1);
18    return 0;
19}

单选题:程序输出是?(忘 pushdown 读到过期叶子值 1;正确应为 3)

(1 分)
第 96 题 P2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 100000;
05    int tree[2 * n];           // 错误:只开 2n
06    // 最坏情况节点数接近 4n——2n 会越界
07    cout << 2 * n;
08    return 0;
09}

判断题:线段树数组开 2n2n 不够——最坏情况节点数接近 4n4n,开小会越界写坏内存。

(1 分)
第 97 题 P3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04int query(int k, int l, int r, int ql, int qr) {
05    if (l <= ql && qr <= r) return tree[k];   // 错误:方向反了(节点包含查询区间)
06    if (qr < l || r < ql) return 0;
07    int mid = (l + r) >> 1;
08    return query(2 * k, l, mid, ql, qr) + query(2 * k + 1, mid + 1, r, ql, qr);
09}
10int main() {
11    cout << query(1, 1, 4, 2, 3);
12    return 0;
13}

单选题:程序输出是?(判断方向反 → 根节点 [1,4] "包含"查询区间 [2,3],直接返回全树和 16;正确应为 8)

(1 分)
第 98 题 P4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int tree[20] = {0, 16, 4, 12, 1, 3, 5, 7};
04void update(int k, int l, int r, int p, int v) {
05    if (l == r) { tree[k] += v; return; }
06    int mid = (l + r) >> 1;
07    if (p <= mid) update(2 * k, l, mid, p, v);
08    else update(2 * k + 1, mid + 1, r, p, v);
09    // 错误:回溯时忘了 pushup
10}
11int main() {
12    update(1, 1, 4, 2, 2);    // a[2] += 2
13    cout << tree[1];
14    return 0;
15}

单选题:程序输出是?(叶子改了但父节点没更新——总和仍是旧值 16;正确为 18)

(1 分)
第 99 题 P5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int l = 1500000000, r = 1500000000;
05    // 错误写法:mid = (l + r) / 2 在 l+r 溢出时出错
06    // 安全写法:mid = l + (r - l) / 2
07    int mid1 = (l + r) / 2;          // l+r = 3×10^9 溢出 int 范围 → 错误
08    int mid2 = l + (r - l) / 2;      // 安全
09    cout << mid1 << " " << mid2;
10    return 0;
11}

单选题:程序输出是?(1.5×109+1.5×109=3×1091.5 \times 10^9 + 1.5 \times 10^9 = 3 \times 10^9 溢出 int 后 mid1 为负;mid2 正确)

(1 分)
第 100 题 P6 未作答

判断题:以下结论全部正确——"数组开 4n;下标 1 起孩子 2k/2k+1;查询三分支;lazy 延迟下传、进入子区间前 pushdown、返回前 pushup;mid 用 (l+r)>>1(小数据)或 l+(r-l)/2(防溢出)"。

(1 分)