hdu 1556 树状数组+点查询

树状数组

N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜 色了,你能帮他算出每个气球被涂过几次颜色吗?

 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找)

例如 区间(2,4)加1

则Updata(2,1)   Updata(4+1,-1)

实现了更新(2,4)的值而不改变其他值

求Sum时即可得到某一点的值

 

hdu 1556 树状数组+点查询

 1 #include<cstdio>

 2 #include<cstring>

 3 using namespace std;

 4 

 5 const int MAXN=100010;

 6 int c[MAXN];

 7 int n;

 8 

 9 int lowbit(int x)

10 {

11     return x&(-x);

12 }

13 void add(int i,int val)

14 {

15     while(i<=n)

16     {

17         c[i]+=val;

18         i+=lowbit(i);

19     }

20 }

21 int sum(int i)

22 {

23     int s=0;

24     while(i>0)

25     {

26         s+=c[i];

27         i-=lowbit(i);

28     }

29     return s;

30 }

31 int main()

32 {

33     int a,b;

34     while(scanf("%d",&n),n)

35     {

36         memset(c,0,sizeof(c));

37         for(int i=0;i<n;i++)

38         {

39             scanf("%d%d",&a,&b);

40             add(a,1);

41             add(b+1,-1);

42         }

43         for(int i=1;i<n;i++)

44           printf("%d ",sum(i));

45         printf("%d\n",sum(n));

46     }

47     return 0;

48 }

 

你可能感兴趣的:(树状数组)