HDU 1566 Color the ball(树状数组)

题目链接

对这个知识不熟啊。。。。自己找了一篇论文,上边一个题,貌似和这个差不多,谁知一点都不一样,怎么也不理解如何通过更改a b之间的全部+1,通过树状数组中更新数组的a和b+1,来操作。。。。实在理解了不了,看了解题报告发现和论文上的题,不一样啊。。。只需要insert(a,1)和insert(b+1,-1)就好了,瞬间我被秒了,意义马上就理解了。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 100001
 4 int p[N],n;
 5 int lowbit(int t)
 6 {
 7     return t&(-t);
 8 }
 9 void insert(int t,int d)
10 {
11     while(t <= n)
12     {
13         p[t] += d;
14         t += lowbit(t);
15     }
16 }
17 int getsum(int t)
18 {
19     int sum = 0;
20     while(t > 0)
21     {
22         sum += p[t];
23         t -= lowbit(t);
24     }
25     return sum;
26 }
27 int main()
28 {
29     int a,b,i,sum;
30     while(scanf("%d",&n)!=EOF)
31     {
32         memset(p,0,sizeof(p));
33         if(!n) break;
34         for(i = 1; i <= n; i ++)
35         {
36             scanf("%d%d",&a,&b);
37             insert(a,1);
38             insert(b+1,-1);
39         }
40         for(i = 1; i <= n; i ++)
41         {
42             sum = getsum(i);
43             if(i == 1)
44                 printf("%d",sum);
45             else
46                 printf(" %d",sum);
47         }
48         printf("\n");
49     }
50     return 0;
51 }
posted @ 2012-07-17 15:48  Naix_x  阅读(355)  评论(11编辑  收藏  举报