hdu1556 分类: hdu 2015-02-10 15:01 75人阅读 评论(0) 收藏
修改区间,求单点值
树状数组:
记原数组为{
假设修改
那么{
b′i=bi+val ,
b′j+1=bj+1−val
这样就维护了
树状数组记录
参考:http://blog.csdn.net/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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。