N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
当N = 0,输入结束。
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
1 1 1 3 2 1
思想是:这么多区间,应该有很多数多次累加的,我们不可能一次次累加,我们可以在区间的一侧加1,一侧减1,再累加。例如(1,5)我们可以在1处加1,在6(区间是封闭的,5的地方也应该加1)处减1,for(i=1;i<=6;i++)num[i]+=num[i-1],我们就发现在1处加的数,在累加的过程中到6就减少了。而累加的范围就是(1,5),就是使用这个原理使这个题的时间大大减少。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int num[100000+10];
int n,a,b;
int main()
{
while(~scanf("%d",&n),n)
{
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a,&b);
num[b]++;
num[a-1]--;
}
for(int i=n-1;i>=1;i--)
num[i]+=num[i+1];
for(int i=1;i<=n;i++)
if(i==n)
printf("%d\n",num[i]);
else printf("%d ",num[i]);
}
return 0;
}