HDU 1556-Color the ball-树状数组

  树状数组的成段更新。

首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和。

更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1。这时,query(a)...query(b)都是1,而query(1)...query(a-1),query(b+1)...query(N)都是0。

这样就跟成段更新的效果相同。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 const int maxn = 100010;
 7 int C[maxn];
 8 int N;
 9 
10 int lowbit(int x)
11 {
12     return x&(-x);
13 }
14 
15 int Query(int x)
16 {
17     int rtn=0;
18     while(x > 0)
19     {
20         rtn += C[x];
21         x -= lowbit(x);
22     }
23     return rtn;
24 }
25 
26 void Insert(int x,int num)
27 {
28     while(x <= N)
29     {
30         C[x] += num;
31         x += lowbit(x);
32     }
33 }
34 
35 int main()
36 {
37     while(scanf("%d",&N) && N)
38     {
39         memset(C,0,sizeof C);
40         for(int i=0;i<N;i++)
41         {
42             int a,b;
43             scanf("%d%d",&a,&b);
44             Insert(a,1);
45             Insert(b+1,-1);
46         }
47         for(int i=1;i<=N;i++)
48             printf("%s%d",i==1?"":" ",Query(i));
49         printf("\n");
50     }
51 }
posted @ 2016-03-15 22:10  Helica  阅读(148)  评论(0编辑  收藏  举报