水过 Picture 的一点想法

POJ 1177 picture

看了好久这道题目,就发现分别沿X、Y方向离散化扫描线,统计两个方向上的周长是个方法……

其实这个方法也不是特别水的那种,开始把数据存下来,先后做两次初始化,所有代码都是可以复用的,时间和空间复杂度基本没什么太大的变化

不过做两遍基本重复的工作从感觉上确实不怎么漂亮啊(有一次扫描线的解法)!

两个方向上的边长统计,还是扫描线加入边出边的思想,做过数星星求面积的题目那么这个思路应该比较好想。遇矩形左边(或者下边)插入线段,右边(或者上边)删除线段(其实就是给线段权值1/-1然后控制计数)。当前插入区间计数值为0时,那么该线段必然就是该段覆盖区域的入边,加上这段边长。还有一种情况就是,当前边插入对应区间使得该区间计数值清零,那么也要加上这段边长,因为这段线段线段必然就是该段覆盖区域的出边。把这个思路应用到两个方向上的离散化扫描线即可解决这个问题。

需要注意的一个问题,当一条入边与一条出边刚好重合时(两个矩形挨在一起),那么要先考虑入边(认为两个矩形重合)而不是先考虑出边(这时两个矩形相当于分离……明显是不对的),这就需要在对扫描线排序时把同一个位置的边的入边排在前面。

PS:无图无真相,大家自己画吧……

陈宏有一篇专门讲线段的论文,抽象的很好,值得一看……

转载于:https://my.oschina.net/llmm/blog/127838

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值