一般的树状数组只支持单点修改、单点查询和区间查询。其实树状数组也可以支持区间修改。最近做题遇到了这种用法,所以记录一下。
我们设原序列为$a_i$,再设$d_i=a_i-a_{i-1}$,这样就有:
所以:
所以:
这样,我们只要分别用树状数组维护$d_i$和$d_i\ast i$的前缀和即可。当我们要修改一个区间$[l,r]$时,只需要修改$l$和$r+1$两个点就行了(其实就是修改差分数组)。查询时只要求一下从$1$到$l-1$和从$1$到$r$的前缀和,然后相减就行了。
单点的操作其实就是长度为一的区间操作,照做就行了。
来看代码吧。
$Talk\ is\ cheap!Show\ me\ the\ code!$
1 | void change(int pos,int data) |