如何利用树状数组修改一个区间?
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 向上求和,向下修改。
具体的不清楚。
以上是关于如何利用树状数组修改一个区间?的主要内容,如果未能解决你的问题,请参考以下文章