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;
}
本文介绍了一种解决区间涂色问题的方法,通过记录每个区间的增量变化,最终计算出每个位置被涂色的次数。使用数组来记录这些变化,左端点加1,右端点的下一个位置减1,然后通过累加得到最终结果。
274

被折叠的 条评论
为什么被折叠?



