修改区间,求单点值
树状数组:
记原数组为{ai},树状数组为{bi},Si为bi前i项和 ,且满足Si=ai,
假设修改ai~aj,得a′k=ak+val,k∈[i,j]
那么{bi}中只需修改两个值:
b′i=bi+val,
b′j+1=bj+1−val
这样就维护了ai=Si
树状数组记录bi的值即可
参考:http://blog.youkuaiyun.com/lanshui_yang/article/details/9496023
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 100005
int n;
int b[MAXN]={0};
int lowbit(int x)
{
return x&(-x);
}
void add(int s,int c)
{
while(s<=n)
{
b[s]+=c;
s+=lowbit(s);
}
}
int count(int s)
{
int ret=0;
while(s>0)
{
ret+=b[s];
s-=lowbit(s);
}
return ret;
}
int main()
{
int i,j,T;int l,r;
#ifndef ONLINE_JUDGE
freopen("hdu1556.in","r",stdin);
freopen("hdu1556.out","w",stdout);
#endif
while(1)
{
scanf("%d",&n);
if(!n)break;
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
{
scanf("%d%d",&l,&r);
add(l,1);
add(r+1,-1);
}
for(i=1;i<n;i++)
{
printf("%d ",count(i));
}
printf("%d\n",count(n));
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文介绍了一种使用树状数组进行区间修改和单点查询的高效算法。通过仅修改树状数组中的两个值来实现对原数组指定区间的更新,同时保持查询功能的准确性。文章提供了详细的实现步骤和C语言代码示例。

被折叠的 条评论
为什么被折叠?



