如何利用树状数组修改一个区间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用树状数组修改一个区间?相关的知识,希望对你有一定的参考价值。

如果有一个问题,它每次修改只修改一个值,每次询问询问一个区间的和,那么用树状数组是非常便捷高效的。

但是如果问题反过来,每次修改一个区间的值,但是每次询问只询问一个值,那么用树状数组该如何解决呢?最好说明具体的操作方法,如果有核心代码就更好啦?最好是C的代码

给你一个树状数组区间修改区间查询的模板吧

const int MAXN=5e5+1;
int n,a[MAXN];
LL C[2][MAXN];
int mul;
#define lowbit(x) (x&-x)
inline void suf(int x,int d)
mul=x-1;
while(x<=n)
C[0][x]+=d,C[1][x]+=mul*d;
x+=lowbit(x);


#define update(x,y,d) suf(x,d),suf(y+1,-d)
int ret;
inline int pre(int x)
ret=a[mul=x];
while(x)
ret+=mul*C[0][x]-C[1][x];
x-=lowbit(x);

return ret;

#define query(x,y) pre(y)-pre(x-1)
/*
a[]预处理 
for(int i=1;i<=n;++i)
cin>>a[i];
a[i]+=a[i-1];

*/

参考技术A int ADD_B(int x, int v)
for (int i=x; i>0; i-=i&(-i)) B[i]+= v;
return 0;

int SUM_B(int x)
int ans = 0;
for (int i=x; i<=n; i+=i&(-i)) s += B[i];
return ans;

修改区间[l,r] 加上v,ADD_B(r,v);if (l>1) ADD_B(l-1,v);
查找点x,SUM_B(x);
还可以修改区间查区间,http://blog.csdn.net/lhy1994/article/details/38413895。
参考技术B 向上求和,向下修改。
具体的不清楚。

以上是关于如何利用树状数组修改一个区间?的主要内容,如果未能解决你的问题,请参考以下文章

树状数组从入门到弃疗

树状数组区间更新

树状数组变形:带区间修改的树状数组

poj3468区间加减查找——树状数组区间修改查询

P3372 模板线段树 1(区间修改区间查询)(树状数组)

树状数组区间修改和区间求和