题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11361 Accepted Submission(s): 5659
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,输入结束。
当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
Author
8600
Source
题目大意:先给一个N,再给一个a,b区间,每一次都把这个区间的气球涂色一遍,N次之后,分别求每个气球被涂了几次颜色。
如果用一个简单的数组来记录,10000*10000想必一定会超时!!
所以这里引入一个小的技巧,就是a的位置+1,b+1的位置-1,最后一个for循环,每一个数都要加上前面那个数的值即可。
详见代码。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 6 using namespace std; 7 8 int num[100000+10]; 9 10 int main () 11 { 12 int T,a,b,Max; 13 while (~scanf("%d",&T)) 14 { 15 memset(num,0,sizeof(num)); 16 Max=0; 17 if (T==0) 18 break; 19 for (int i=1; i<=T; i++) 20 { 21 scanf("%d%d",&a,&b); 22 num[a]++; 23 num[++b]--; 24 25 } 26 for (int i=1; i<=T; i++) 27 { 28 num[i]+=num[i-1]; 29 if(i==1) 30 printf ("%d",num[i]); 31 else 32 printf(" %d",num[i]); 33 } 34 printf ("\n"); 35 } 36 return 0; 37 }