POJ 1177 picture
看了好久这道题目,就发现分别沿X、Y方向离散化扫描线,统计两个方向上的周长是个方法……
其实这个方法也不是特别水的那种,开始把数据存下来,先后做两次初始化,所有代码都是可以复用的,时间和空间复杂度基本没什么太大的变化。
不过做两遍基本重复的工作从感觉上确实不怎么漂亮啊(有一次扫描线的解法)!
两个方向上的边长统计,还是扫描线加入边出边的思想,做过数星星求面积的题目那么这个思路应该比较好想。遇矩形左边(或者下边)插入线段,右边(或者上边)删除线段(其实就是给线段权值1/-1然后控制计数)。当前插入区间计数值为0时,那么该线段必然就是该段覆盖区域的入边,加上这段边长。还有一种情况就是,当前边插入对应区间使得该区间计数值清零,那么也要加上这段边长,因为这段线段线段必然就是该段覆盖区域的出边。把这个思路应用到两个方向上的离散化扫描线即可解决这个问题。
需要注意的一个问题,当一条入边与一条出边刚好重合时(两个矩形挨在一起),那么要先考虑入边(认为两个矩形重合)而不是先考虑出边(这时两个矩形相当于分离……明显是不对的),这就需要在对扫描线排序时把同一个位置的边的入边排在前面。
PS:无图无真相,大家自己画吧……
陈宏有一篇专门讲线段的论文,抽象的很好,值得一看……