树状数组
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 }


浙公网安备 33010602011771号