我想知道是否可以使用二进制索引树(BIT)来实现按位AND的范围查询(而不是常用的范围和)?
以下是更新部分的代码:
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范围查询?
答案 0 :(得分:1)
这是不可能的(至少只使用一个BIT)。原因很简单:如果您知道前缀a - 1
和前缀b
的按位AND,则无法唯一确定[a, b]
范围的按位AND。例如,如果query(0)
为1
且query(1)
为1
,则query(1, 1)
的答案(即索引为1
的元素)可以是2
不能整除的任何数字。
我建议改用分段树。
答案 1 :(得分:1)
要扩展user2040251's answer,如果您感兴趣,可以使用多个二进制索引树来完成。
考虑一下。当且仅当范围中的和等于范围的大小时,该范围内的AND将为1(否则为0,因为该范围中的至少一个必须为0)。
所以你需要每比特一个BIT,每比特需要两个查询,所以总体来说它没有那么好,但确实有效。