单点修改,区间查询
普通树状数组即可,略。
区间修改,单点查询
树状数组维护差分数组即可。
区间修改,区间查询
还是考虑维护差分数组。
易知:
$ ai=j=1∑ibj $
那么 a 的前缀和:
si=j=1∑iaj=j=1∑ik=1∑jbk=j=1∑i(i−j+1)bj=(i+1)j=1∑ibj−j=1∑ij×bj
分别维护 bi 的前缀和和 (bi×i) 的前缀和。
模板
二维树状数组:单点修改,区间查询
从一维的树状数组类推。
$ sa,b=i=a−lowbit(a)+1∑aj=b−lowbit(b)+1∑bai,j $
模板
注意:修改/查询时不能用x/y作为循环变量!
二维:区间修改,区间查询
同样考虑维护差分矩阵。
矩阵如何差分?可以将 a 看作差分矩阵 b 的矩阵前缀和,那么反过来用 a 表示 b :
$ bi,j=ai,j−ai−1,j−ai,j−1+ai−1,j−1 $
但其实这个式子并不重要,我们只需要知道 a 是 b 的前缀和就行了。即
$ ax,y=i=1∑xj=1∑ybi,j $
同样计算 b 的贡献:
sx,y=i=1∑xj=1∑yai,j=i=1∑xj=1∑yk=1∑il=1∑jbk,l=i=1∑xj=1∑ybi,j×(x−i+1)(y−j+1)=i=1∑xj=1∑ybi,j×[(x+1)(y+1)−(y+1)i−(x+1)j+ij]
于是分别维护 bi,j 、 (bi,j×i) 、 (bi,j×j) 、 (bi,j×i×j) 即可。
模板
update@21-11-25
权值树状数组求第k大
值域 (0,maxa]