【发布时间】:2020-03-18 13:51:39
【问题描述】:
我发现很多人使用x += x & (-x)、x -= x & (-x) 来解决区间树问题(在实现数据结构如段树、二叉索引树等时)。
你能解释一下这个等式是什么意思吗?
例如:
void update(int m, int x) {
m++;
while (m < N) {
t[m] = t[m] + x;
m += m & -m;
}
}
int query(int m) {
int result= 0;
m++;
while (m > 0) {
result = result + t[m];
m -= m & -m;
}
return result;
}
【问题讨论】:
-
这是一些位技巧,但我太无聊了,无法自己解决。您应该能够通过尝试测试
m的各种值并查看结果得到什么来解决这个问题,重复使用不同的m值直到您看到一个模式。 -
你知道
int是如何用二进制表示的吗?m和-m的表示有什么区别?&导致只有他们两个都有的 1 位。 -
我知道
m、-m和&中的每一个,但我不知道我能从等式中得到什么。正如@SamVarshavchik 所说,我认为我应该尝试各种测试用例。谢谢大家!
标签: c++ algorithm bitwise-operators segment-tree binary-indexed-tree