【发布时间】:2021-10-15 23:59:31
【问题描述】:
给定一个包含 n 个整数的数组,索引从 1->n。任务是执行 Q 给定的查询,并在每次查询后打印数组的总和。
我们可以执行三种类型的操作:
- 1 X:将 X 添加到数组中(其索引将为 n+1、n+2、...)
- 2 Y:从数组中移除索引为 Y 的元素
- 3 Z:对数组中的每个元素 i,执行 i^Z (i xor Z)
示例:
输入
arr[] = {2, 3, 9, 5, 6, 6}, Q = 5
1 3
3 5
2 2
3 2
2 7
输出: 34 37 31 27 23
解释:
1 3 -> arr[] = {2, 3, 9, 5, 6, 6, 3} -> sum = 34
3 5 -> arr[] = {7, 6, 12, 0, 3, 3, 6} -> sum = 37
2 2 -> arr[] = {7, 12, 0, 3, 3, 6} -> sum = 31
3 2 -> arr[] = {5, 14, 2, 1, 1, 4} -> sum = 27
2 7 -> arr[] = {5, 14, 2, 1, 1} -> sum = 23
P/S:我正在尝试解决段树的问题,但我无法使用 XOR 运算符更新树。有没有其他方法可以解决这个问题?我试图在 O(n.logn) 中解决它
【问题讨论】:
-
2 7(最后一个查询)如何工作?它似乎正在删除数组的第 6 个元素(而不是第 7 个)。或者更确切地说,我想我的问题是:删除操作是缩小数组还是在操作后数组中有一个“洞”? -
不确定为什么需要一棵树。提示:尝试分别计算和的每一位。
-
@Maurycyt 这也是我正在努力解决的问题,“2 7”查询删除了索引为 7 的元素(不是第 7 个元素),这是第 6 个元素,因为我们删除了索引为 2 的元素
-
不,单独考虑每个位只会增加常数,因为(很可能)最多需要考虑 64 位
-
您不需要在每次执行查询时检查每个数字。您只需执行一次,并存储结果。然后您可以非常快速地更新这些结果。
标签: algorithm xor segment-tree bitwise-xor