树状数组
【模板】
单点修改。时间复杂度 O(logn)
void add(int pos, int w)
{
while (pos <= n)
{
tree[pos] += w;
pos += lowbit(pos);
}
}
区间查询。时间复杂度 O(logn)
返回的是从1到pos的值的和。
int query(int pos)
{
int res(0);
while (pos > 0)
{
res += tree[pos];
pos -= lowbit(pos);
}
return res;
}
lowbit。表示x的二进制表达式中最低位的1所对应的值。
int lowbit(int x) { return x & -x; }
关于区间修改。其实就是用将以差分的形式构建树状数组,例如将 [x, y] += w时,设d[ ]为差分数组,那么就
add(x, k); add(y + 1, -k);
同理差分下的单点查询就是query(x)。这是因为将1~x的差分全部加起来,就是x这个数本身。

浙公网安备 33010602011771号