HDU 1556-Color the ball-树状数组
树状数组的成段更新。
首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和。
更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1。这时,query(a)...query(b)都是1,而query(1)...query(a-1),query(b+1)...query(N)都是0。
这样就跟成段更新的效果相同。
1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 6 const int maxn = 100010; 7 int C[maxn]; 8 int N; 9 10 int lowbit(int x) 11 { 12 return x&(-x); 13 } 14 15 int Query(int x) 16 { 17 int rtn=0; 18 while(x > 0) 19 { 20 rtn += C[x]; 21 x -= lowbit(x); 22 } 23 return rtn; 24 } 25 26 void Insert(int x,int num) 27 { 28 while(x <= N) 29 { 30 C[x] += num; 31 x += lowbit(x); 32 } 33 } 34 35 int main() 36 { 37 while(scanf("%d",&N) && N) 38 { 39 memset(C,0,sizeof C); 40 for(int i=0;i<N;i++) 41 { 42 int a,b; 43 scanf("%d%d",&a,&b); 44 Insert(a,1); 45 Insert(b+1,-1); 46 } 47 for(int i=1;i<=N;i++) 48 printf("%s%d",i==1?"":" ",Query(i)); 49 printf("\n"); 50 } 51 }