查一段区间和要多久
用线段树查任意一段区间的和,代价是【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 +