查一段区间和要多久

用线段树查任意一段区间的和,代价是【0】。

开始练习 →

中间那三个数的和

数组是 17、24、15、13、23。运行下面这段程序(查下标 1 到 3): def seg_build(a, node, l, r, tree): if l == r: tree[node] = a[l]

开始练习 →

整段里最大的是几

同一个数组。运行下面这段程序: A = [17, 24, 15, 13, 23] print(max(A))

开始练习 →

把线段树建起来

补全 seg_build:叶子存单个元素,非叶子存左右两个孩子之和。 建好之后输出根节点存的值(也就是整段的和)。

开始练习 →

查一段区间的和

补全 seg_sum:查下标 ql 到 qr 这一段的和。 查下标 1 到 3,输出结果。

开始练习 →

把"求和"换成"求最大"

线段树不止能求和。补全 max_build:把合并那一步从相加换成取较大的。 建好之后输出根节点存的值。

开始练习 →

改一个值,再查一次

把下标 2 上的 15 改成 30,然后重新查下标 1 到 3 的和。 (这里偷个懒:改完之后整棵树重建一次。真正的线段树只需要沿着一条路往上更新,代价是 O(log n)。)

开始练习 →

树状数组解决什么问题

树状数组(Fenwick)擅长的是【0】。

开始练习 →

lowbit 取的是什么

lowbit(x) 取的是【0】。

开始练习 →

前三个数的和

数组是 17、24、15、13、23。运行下面这段程序: def lowbit(x): return x & (-x) def fen_build(a): n = len(a) t = [0] * (n +

开始练习 →