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]