hdu 1541 Stars

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541

思路:要求求出不同等级的星星的个数,开始怎么也想不到用树状数组,看完某些大神的博客之后才用树状数组写的,搞了好久才懂得数组的更新过程

 1 #include<cstdio>  
 2 #include<iostream>  
 3 #include<algorithm>
 4 #include<math.h> 
 5 #include<string.h>  
 6 #include<vector> 
 7 #include<queue>
 8 #include<iterator>
 9 #include<vector>
10 #include<set>
11 #define dinf 0x3f3f3f3f
12 typedef long long ll;
13 const int Max=(1<<16)+10;
14 using namespace std;
15 
16 #define SIZE 1000005
17 
18 int c[SIZE],level[SIZE],n;
19 
20 int Lowbit(int x)
21 {
22     return x&(-x);
23 }
24 
25 int Sum(int x)
26 {
27     int sum=0;
28     while(x>0)
29     {
30         sum+=c[x];
31         x-=Lowbit(x);
32     }
33     return sum;
34 }
35 
36 void Update(int i,int x)
37 {
38     while(i<=SIZE)//要把所有的与i相关的c数组中的值全部更新,不然会出错 
39     {
40         c[i]+=x;
41         i+=Lowbit(i);
42     }
43 }
44 
45 
46 int main()
47 {
48     while(~scanf("%d",&n))
49     {
50         memset(level,0,sizeof(level));
51         memset(c,0,sizeof(c));
52         int x,y;
53         for(int i=0;i<n;i++)
54         {
55             scanf("%d %d",&x,&y);
56             level[Sum(++x)]++;
57             Update(x,1);
58             /*
59             for(int j=0;j<10;j++)
60                 printf("%d ",c[j]);
61             printf("\n");
62             for(int j=0;j<10;j++)
63                 printf("%d ",level[j]); 
64             printf("\n");
65             */
66         }
67         for(int i=0;i<n;i++)
68             printf("%d\n",level[i]);
69     } 
70     return 0;
71  } 

附上样例中数组的更新过程,上面一行是c[i],下面是level[i]

posted @ 2016-07-26 10:39  pter  阅读(135)  评论(0编辑  收藏  举报