hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树

给定敌舰坐标,要求用固定大小的矩形进行覆盖,使得覆盖到的敌舰数量最多。通过以矩形中心为基准,确定覆盖范围,并利用线段树进行离散化处理。在处理过程中注意线段树叶节点表示的区间,确保边界敌舰也被考虑。最后,通过更新线段树节点的覆盖最大值,求解最优解。

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

给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最多,矩形边框上的敌舰也算在内。矩形可以平移,不能旋转。

我们用矩形的中心点来描述这个矩形,然后对于每个敌舰,我们建立一个矩形中心的活动范围,即矩形中心在该范围内活动就可以覆盖到该敌舰.那么我们要求的问题就变成了:任意一个区域(肯定也是矩形的)最多能被矩形覆盖的最大值.(即假如有价值为5和价值为3的矩形覆盖了一个区域,那么这片区域的价值为8).

在用线段树离散化y轴坐标的时候发现线段树上的每个叶节点表示的是一个半闭半开的区间[y1,y2),[y2,y3) 等.所以现在少了边框上的敌舰的情况,这时只要把给定的w,h伸长0.5即可。

cnt:保存的是当前节点被覆盖的值.
sum:表示该节点控制的区域内,被覆盖的最大值.

所以向上更新方程为sum[i]=max(sum[i*2],sum[i*2+1]) + cnt[i];


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值