c++ - 二叉索引树应用于按位与

标签 c++ algorithm tree

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

最佳答案

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

我建议改用线段树。

关于c++ - 二叉索引树应用于按位与,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26615147/

相关文章:

algorithm - k叉树归纳证明

java - 从边构造树

c++ - vector::insert 函数的包装器

c++ - FW1FontWrapper IFW1ColorRGBA

algorithm - 当我尝试测试空列表时,为什么在 Scheme 中会出现错误?

c++ - 需要帮助理解 FFT 算法中的这一行

c++ - 使用#line 控件时调试器的奇怪行为

c++ - 如何将 protobuf 的 boost::shared_ptr 指针传递给函数?

algorithm - 查找和为零的连续子数组的数量

algorithm - 遍历任意树结构中的每条唯一路径(从根到叶)