树状数组

2^k:

int lowbit(int t)
{
    return t&(-t);
}

简单的数据结构,占用的时间少,是在O(logn)时间里插入,求和。

(1)hdu 1541 Stars
基本的题,因为加入点的顺序,每次就是求区间(0,x)的和。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define size 32005
 5 const int max=32005;
 6 int num[size];
 7 int level[size];
 8 int lowbit(int t)
 9 {
10     return t&(-t);
11 }
12 void insert(int k,int d)
13 {
14     while(k<=max)
15     {
16         num[k]+=d;
17         k=k+lowbit(k);
18     }
19 }
20 int gsum(int k)
21 {
22     int t=0;
23     while(k>0)
24     {
25         t+=num[k];
26         k-=lowbit(k);
27     }
28     return t;
29 }
30 int main()
31 {
32     int n,x,y;
33  //   freopen("test","r",stdin);
34     while(scanf("%d",&n)!=EOF)
35     {
36         memset(num,0,sizeof(num));
37         memset(level,0,sizeof(level));
38         for(int i=0;i<n;i++)
39         {
40             scanf("%d%d",&x,&y);
41             x++;
42             level[gsum(x)]++;
43             insert(x,1);
44         }
45         for(int i=0;i<n;i++)
46         {
47             printf("%d\n",level[i]);
48         }
49     }
50     return 0;
51 }

 

 

posted @ 2012-10-07 16:18  feng_linxu  Views(115)  Comments(0)    收藏  举报