应用于按位与的二进制索引树
Posted
技术标签:
【中文标题】应用于按位与的二进制索引树【英文标题】:Binary index tree applied to bitwise AND 【发布时间】:2014-10-28 17:52:50 【问题描述】:我想知道是否可以使用二叉索引树(BIT)来实现按位与的范围查询(而不是通常使用范围求和)?
这是我更新部分的代码:
memset(BIT,1<<20-1,sizeof(BIT));
void update(int idx)
while(idx<=n)
BIT[idx] &= a[idx];
idx += idx&(-idx);
谁能告诉我是否可以为查询部分编写代码?据我所知,范围总和查询类似于:
int query(int idx)
int res = 0;
while (idx)
res += BIT[idx];
idx -= idx&(-idx);
return res;
要查询[a,b]
的和,答案是query(b)-query(a-1)
。如何将其修改为按位 AND 范围查询?
【问题讨论】:
【参考方案1】:这是不可能的(至少只使用一个 BIT)。原因很简单:如果您知道前缀a - 1
和前缀b
的按位与,则不可能唯一确定[a, b]
范围的按位与。例如,如果query(0)
是1
并且query(1)
是1
,则query(1, 1)
(即索引为1
的元素)的答案可以是任何不能被2
整除的数字.
我建议改用分段树。
【讨论】:
【参考方案2】:要扩展user2040251's answer,如果您有兴趣,可以使用几个二叉索引树来实现。
考虑一点。当且仅当某个范围内的总和等于该范围的大小时,该范围内的 AND 将为 1(否则为 0,因为该范围内至少有一个事物必须为 0)。
所以你需要一个 BIT 一个位,每个位需要两个查询,所以总而言之它的效果不是很好,但它确实有效。
【讨论】:
谢谢哈罗德。您能否展示一些示例代码来说明这个 2d BIT?谢谢 @ChuNan 它只是一个 BIT 数组(二维 BIT 更复杂)。因此,您将有一个 BIT 来处理您存储的整数的所有最低有效位,一个 BIT 用于第二位,依此类推。它们中的每一个都完全按照您的预期工作,您现在拥有的更多。以上是关于应用于按位与的二进制索引树的主要内容,如果未能解决你的问题,请参考以下文章