HDOJ 1556 Color the ball

http://acm.hdu.edu.cn/showproblem.php?pid=1556

树状数组解法:

题意:给N段连续的球上色,求上色后每个球被涂色的次数。

思路:假设有一个数组d,令其的初值为0。若涂色 [ L,R ] 的区间,则令d [ L ] +=1;d [R] - =1;C [ i ] 为对应数组d的前i项和,这样C是 [ L,R ] 的区间就记录了球的涂色次数。因为实际操作时d数组用不到,故可以略去。通过这个技巧就将断更新转化为了点更新,求第i个球涂几次只需求d的先i项和(即C [ i ] )即可。这样就变成一个简单的树状数组求和问题了~

关于C数组和d数组的关系举个例子吧:

第一次涂 [ L,R ] 区间:

下标 1    2    3    4    5    6    7    8    9    ……

C   :  0    0    1    1    1    1    0    0    0    ……

d   :  0    0    1    0    0    0   -1    0    0    ……

                      L                R   R+1

#include<stdio.h>
#include<string.h>

#define maxn 111111

int n,C[maxn];

int Lowbit(int x)
{
	return x&(-x);
}

void updata(int i,int x)
{
	while(i<=n)
	{
		C[i]+=x;
		i+=Lowbit(i);
	}
}

int sum(int end)
{
	int sum=0;
	while(end>0)
	{
		sum+=C[end];
		end-=Lowbit(end);
	}
	return sum;
}
int main()
{
	while(scanf("%d",&n)&&n)
	{
		int i,m=n;
		memset(C,0,sizeof(C));
		while(m--)
		{
			int a,b;
			scanf("%d %d",&a,&b);
			updata(a,1);
			updata(b+1,-1);
		}
		printf("%d",sum(1));
		for(i=2;i<=n;i++)
			printf(" %d",sum(i));
		printf("\n");
	}
	return 0;
}
线段树解法:用线段树做就很简单啦~(代码有时间再补一下啦)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值