题面:
N个气球排成一排,从左到右依次编号为1,2,3….N.每次给定2个整数a b(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
题意很简单没什么说的,重点就是怎么优化这个计算每个气球涂色的过程,不然会超时。
我用的方法是用book1来记录每次涂色的起点位置,book1[i]的值加1,用book2来记录每次涂色的终点位置,book2[j]的值减一。
这样对于每一个气球,将涂色次数的问题转化为了区间重叠问题。用一个变量从头开始遍历,对于每一个位置先加上这个位置的book1的值,就是这个位置的气球涂色次数,再减去这个位置的book2的次数,即涂色到这里结束的区间个数,然后看下一个。
做完之后学长和同学说这是个线段树,树状数组的题,之后再写一遍吧。
第一篇博客,不足之处还望指正。
当时AC的代码
#include <stdio.h>
#include <string.h>
using namespace std;
int book1[100005];
int book2[100005];
int main()
{
int n,a,b,i,j;
int ans=0;
while(scanf("%d",&n)!=EOF,n)
{
ans=0;
memset(book1,0,sizeof(book1));
memset(book2,0,sizeof(book2));
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
book1[a]++;
book2[b]--;
}
for(i=1;i<n;i++)
{
ans+=book1[i];
printf("%d ",ans);
ans+=book2[i];
}
ans+=book1[i];
printf("%d\n",ans);
}
}