【模板】
单点修改。时间复杂度 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这个数本身。
标签:树状,int,res,pos,差分,add,数组,lowbit From: https://www.cnblogs.com/bszzz/p/17582632.html