Problem:acm.hdu.edu.cn/showproblem.php?pid=1556
题意:题目是说多次给区间 [ a ,b ] 的每一个气球涂一次色,最后问每一个气球分别总共被涂了多少次色
分析:在搜线段树专题 的时候在别人博客看到的一道题,说是线段树入门(见:blog.youkuaiyun.com/acm_davidcn/article/details/5834373)。然而,并没有写成 线段树,只是打了下标记。
用一个数组记录增量,每次读入一区间左、右端点后,左端点位置(记为a)的增量 +1,右端点位置(记为b)的下一个位置(b+1)的增量 -1
最后求和时,用一个变量 sum 累加各个位置的增量并输出
对每一个增量,作用域是 [ a ,b ] ,在 a 加1后,在 b+1 才减去,sum 在累计时在 a 位置收到的增量,会持续作用到 b 位置,而在 b+1 位置及时消去
#include <stdio.h>
#include <string.h>
#define N 100000
int add[N+2];
int main()
{
int n;
while(~scanf("%d", &n) && n)
{
int i, sum;
memset(add, 0, sizeof add);
for(i=0; i<n; ++i)
{
int l, r;
scanf("%d%d", &l, &r);
// 左端点增量
++add[l];
// 右端点下一位置减去
--add[r+1];
}
// sum 边累加边输出
for(sum=0,i=1; i<=n; ++i)
printf("%d%c", sum+=add[i], i==n?'\n':' ');
}
return 0;
}