二进制索引树应用于按位AND

时间:2014-10-28 17:52:51

标签: c++ algorithm tree

我想知道是否可以使用二进制索引树(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范围查询?

2 个答案:

答案 0 :(得分:1)

这是不可能的(至少只使用一个BIT)。原因很简单:如果您知道前缀a - 1和前缀b的按位AND,则无法唯一确定[a, b]范围的按位AND。例如,如果query(0)1query(1)1,则query(1, 1)的答案(即索引为1的元素)可以是2不能整除的任何数字。

我建议改用分段树。

答案 1 :(得分:1)

要扩展user2040251's answer,如果您感兴趣,可以使用多个二进制索引树来完成。

考虑一下。当且仅当范围中的和等于范围的大小时,该范围内的AND将为1(否则为0,因为该范围中的至少一个必须为0)。

所以你需要每比特一个BIT,每比特需要两个查询,所以总体来说它没有那么好,但确实有效。