HDU 3511扫描线

这题对本菜鸟来说较难啊....

分析一下.

题目求哪个圆被包的次数最多..暴力显然不行.扫描线?嗯..有道理!!

可是怎么扫呢.....扫尼玛啊.....

看过题解的菜鸟低空掠过.....

但是题解其实没告诉你怎么扫.而是告诉了你再扫的过程中你可以这么搞...

这里引用某牛的BOLG http://hi.baidu.com/bobo__bai/item/17f7b28bd5994a5d850fab39

上面写着题解.的做法.

题解怎么说的就不说了...说我看完题解和代码后的明白了什么...

首先一个圆有左右两边界l,r

前面也做过一个圆的扫描线.但是对于这题.就算你知道遇见l就加入额....set 集合里面去.那你知道set里面怎么拍的序么?也就是说你知道你插入当前圆

的时候插在什么位置.简单来说.这个圆的上面是谁.下面是谁。

(因为这里哦圆不相交嘛,所以只有一个相对位置关系,也就是上下,左右.但是圆转来转去上下其实和左右差不多.嘿嘿.so,我们就单考虑个上下吧.反正能解决问题。)

嗯.接着说.判断圆的上下是哪个其他的圆真的很疼.想想也明白.

开始我以为根据加入的圆的l,r来判断这个区间里面的其他在该圆上下的圆.....但是没用.比如这样.你插入下面的圆的时候难道说这个圆上面的圆同时是左边的和右边的?显然不能这么搞.(反正是错误思想...)

 

这里我们要注意.题目已经说了圆不相交.那么它们的位置其实只有外面和里面之分(废话)..那么我们再考虑加上一个圆的左右边界.那么对于这个圆来说在他上面的圆和下面的圆其实已经确定了.如上图.其实你先加进去的是大圆.这时你并不会认为他的上圆是左边的小圆.因为还没加进来的嘛.然后当左小圆加入的时候.小圆相对于大圆.大圆变成了小圆的下紧邻圆.自然.小圆成了大圆的相对上紧邻的圆.而当左小圆出了set集合以后,右小圆又来了....所以.在一个圆的L--R范围内.他的上下紧邻圆是根据相对位置来确定的.

 

因此我们在扫描的过程中从左往右一次检测每个圆,对于那些加进去的圆与当前的圆的相对位置可以这么求.当前圆的左边界是现在扫描线的位置.对已经加入的圆可以求出相对于扫描线的上边界和下边界(下图).按这些求出的上下界排序.放在set里面.当然记得保存上下界是属于哪个圆.然后必然当前圆就插入到一个额...合适的位置,一个介于某两个确定的圆中间.因此你可以知道这个圆的上下是谁了.

 

到以F为圆心的圆时.最外层的圆的相对上界是A/。下界是B,中间的那个圆.蓝线。的上界是C,下界是D.把A B C D对应的高度排序插入set中就好了.插入F时返回的必然是C D .

其他的同理计算.

这个时候可以按题解的4种情况讨论了...

就这么搞...

看来设计一个扫描线算法真的有点难对本菜来说....

扫描线什么的.都是数据范围大.离散化是必须的.

这种圆相关的扫描线..没做几个。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值