HDU1556 - Color the ball (线段树超时 利用数组解决)


题目链接

思路

看上去就是一道简单的线段树的应用,区间更新,单点查询,但直接做却超时了。
找优化方法的时候得到了另一种方法,利用数组来进行解决。
我们都知道如果只解决区间求和问题的时候,可以直接对数组进行处理,
处理

for(int i=1; i<=n; i++) ans[i] += ans[i-1];

查询

result = ans[right] - ans[left-1];

同样的,如果我们要对区间 [a, b] 进行涂色,如果我们在 ans[a] 处加 1,然后对数组也进行如上的处理,那么这个加 1 的效果就会一直持续在 a 后面的所有区间,但我们只需要 [a, b]段,所以我们将 ans[b-1] -1, 那么加 1的效果就会在这里中断。

代码

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
const int maxn = 100000;
int ans[maxn+10];
int main()
{
    int n, a, b, re;
    while(scanf("%d", &n)&&n)
    {
        memset(ans, 0, sizeof ans);
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d", &a, &b);
            ans[a]++;
            ans[b+1]--;
        }
        re = 0;
        for(int i=1; i<=n; i++)
        {
            re += ans[i];
            printf("%d%c", re, " \n"[i==n]);
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值