Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6084 Accepted Submission(s): 3227
Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一
次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。 当N = 0,输入结束。
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
Sample Input
3
1 1
2 2
3 3
3
1 1
1 2
1 3
0
Sample Output
1 1 1
3 2 1
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <string.h> 5 #include <math.h> 6 using namespace std; 7 int a[1000000]; 8 int n; 9 int lowbit(int x) 10 { 11 return x&(-x); 12 } 13 void update(int x,int y) 14 { 15 x--; 16 while(y>0) 17 { 18 a[y]++; 19 y-=lowbit(y); 20 } 21 while(x>0) 22 { 23 a[x]--; 24 x-=lowbit(x); 25 } 26 } 27 int fun(int x) 28 { 29 int sum=0; 30 while(x<=n) 31 { 32 sum+=a[x]; 33 x+=lowbit(x); 34 } 35 return sum; 36 } 37 int main() 38 { 39 while(cin>>n&&n){ 40 int i,j; 41 memset(a,0,sizeof(a)); 42 for(i=0;i<n;i++) 43 { 44 int x,y; 45 scanf("%d%d",&x,&y); 46 update(x,y); 47 } 48 for(i=1;i<n;i++) 49 { 50 printf("%d ",fun(i)); 51 } 52 printf("%d ",fun(i)); 53 } 54 }