hdu 1556 Color the ball

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problemacm.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值