[POJ 2043]

Area of Polygons

计算几何。

题意是,给出一个多边形的顶点(坐标都为整数)描述,要求该多边形在网格上覆盖的格子数目。

基本思路是扫描线,从左到右,同时维护一个有序数组s,记录当前区间内存在的线段的y值,线段必定是成对出现的,且每对线段间的区域为多边形内部。这样就可以计算每个区间内被覆盖的格子数了。

具体的实现上,首先初始化所有的n条线段,并放入一个表头大小为4001的邻接表中,方便扫描线时将新扫到的线段加入。垂直的线段直接忽略。对线段结构体记录其当前y值,斜率k,终点xr,以及删除标记b。每次处理一个区间的线段时,删除线段即为将标记位置1。对s内的线段排序时,首先将被删除的线段都放到最后,然后若y值不同则按y从小到大排序,否则再按斜率k从小到大排序。

计算每段区间[x,x+1]内被覆盖的格子数时,需要注意若连续的多条线段过于接近,要避免重复计算。同时取floor或ceil时,需要对y值增或减eps,以舍去计算误差。

总体上来说虽然细节较多,仔细思考后还是比较顺利地1A了。不过也写了一整个下午……