树状数组专题
一直感觉树状数组用处比较小而且局限、因为最基本的用法就是单点更新和区间求和、但是线段树也能做,只不过代码长一点,但是仔细的去了解了一下树状数组以后发现有很多很赞的地方值得学习。
一、代码模板
1.单点更新、区间求和
for(int x = i; x <= n; x += x&-x) c[x] ++; //a[i]单点更新加一
for(int x = r; x ; x -= x&-x) res += c[x]; //求前缀[0,r]
2.区间更新、单点查询
对于操作C L R t :在区间L-R上每个值增加t
for(int x = L; x <= n; x += x&-x) b[x] += t;
for(int x = R+1; x <= n; x += x&-x) b[x] -= t;
对于操作Q i :查询当前a[i]的值
int res = a[i];
for(int x = i; x ; x -= x&-x) res += b[x];
3.区间更新、区间查询
对于操作 C L R t : 对于数组a[n] 区间L-R都增加 t
for(int x = L; x <= n; x += x&-x) b[x] += t, c[x] += L*t;
for(int x = R+1; x <= n; x