[POJ 1177]

Picture

题意大概是,给出N个矩形的描述,矩形间可能有重叠,问最后图形的总周长。

这题和早上做的November Rain都被人分类成线段树,但我愣是没有想明白,这个线段树可以怎么用。也都是数组处理了一下就A了。

说说这题,首先周长可以划分为平行于x轴和平行与y轴两部分。这两部分是独立的,可以分类处理,且处理方式类似。下面以与x轴平行为例说明。

首先将所有点坐标离散化,然后用一个struct数组,记录每条边的:y坐标、起止x离散坐标、下边界标记b(是某矩形下边界则为1,否则为0)。然后将2N条边先按y从小到大,再按x从小到大排序。初始化一个全0的数组t,大小为离散化x坐标的个数,表示某段边被覆盖的次数。然后遍历struct数组,对每条边,更新其包含的各线段j的覆盖情况,若边的b==1,则t[j]++,若此时t[j]==1则表示为图形的下边界,为周长的一部分;若边的b==0,则t[j]–,若此时t[j]==0则表示为图形的上边界,也为周长的一部分。

与Y轴平行的边,处理方式类似。由此便能在O(2N*lg(2N)+2NK)的时间内计算完整个图形的周长了,这里K是每条边包含离散线段的数目。貌似K最多是O(N)的,但题目没有这么刁钻的数据,最后也就跑了16MS。