国家集训队作业rain.pdfVIP

  • 0
  • 0
  • 约5.55千字
  • 约 5页
  • 2022-05-26 发布于北京
  • 举报
Rain ACM/ICPC World Finals 2010 Problem H 【简要描述】 给出一片山地的地形图。山顶抽象为平面图中的点,山脊抽象为平面图中的边。 给出平面图中N 个点的坐标和海拔,以及S 条山脊各自所连接的山顶名称,保证给出 的图是三角剖分好的(即保证输入是平面图,并且任意面积有限的区域一定是一个三角形, 同时保证每条边一定属于至少1 个至多2 个面积有限的区域的边界),每个三角区域对应山 谷中的一个山坡(可以认为是一个平面)。地形图上无法确定高度的部分海拔高度为 0 ,与 大海相连。 现在下了一场大雨(可以认为雨量无限),问现在在这片山地中形成了多少个湖,输出 各个湖水平面的海拔高度。 一个湖必须包含体积为正的水。每一个湖内部,乘坐一条体积不为0 (可以认为是一个 点,但是存在体积)的船,必须能够周游湖面上任意一个地方。 题目没有给出数据规模。 【分析与算法设计】 这道题是这次ACM/ICPC World Finals 上最有思考难度的题——而且,所有拿到奖牌的 队伍也没有一支能够在赛场上解决这个问题。 题目本身没有给出平面图的规模,因此我们必须尝试在算法的每一步都争取做到最好。 下面我们一点一点来分析这个问题。 由于这是一个三角剖分好的平面图,因此,一个最小的湖的单元一定是一个山坡(即一 个面,后面我们称面)——当然一个面是不可能形成湖的,但是我们可以从这个最小的单元 开始考虑问题。 考虑三个顶点为x ,y ,z 的面,三个点海拔分别为h ,h ,h ,不妨设h ≤h ≤h 。则显 x y z x y z 然的,如果这个面上有水保留,那么水平面的海拔一定至少应该超过 h 。那么一定不超过 x h 么?显然不是的。如图: z 我们可以将右侧这个看作是一个装满 了水的“湖”,“湖”的四壁是若干面(均 为三角形)。 可以发现,我们用红色线条,橘红色 标记的这个“湖”的底面,显然任意位置 的水位都超过了这个底面的任意位置的海 拔。 虽然我们一开始的猜想是错误的,可 我们同时也发现了,虽然并不是所有的面 Fig.1 上的水位都等于h ,但是的确是存在很多的面的上方的水位确实等于h ——其实,是对于任 z z 意一个湖,其一定满足其海拔高度与某个其内部的面上的某个点的海拔相同,这个点很可能 是h ——这么说其实还并 确其实更确切的,下面我们做一个简单的定义: z 假设一条边连接点 u 和点 v ,两个点的海拔分别为h 和 h ,我们定义边(u,v) 的高度为 u v H(u,v) ,满足H(u,v)=min{h ,h },则我们有结论: u v 结论1:一个湖的海拔一定与某一条边的高度相同。 结论1 的正确性很显然——其实这就是简单的木桶原理。 虽然结论1 很简单,但是仅仅利用结论1 是完全足够我们得到一个正确可行的算法的。 算法1: 由于我们先前已近分析过一个面是否可能存在湖,所以到这里我们就简单的得出了一个 算法的雏形: 1)从大到小枚举湖所有可能的高度; 2 )判断当前高度是否可能是一个合法的湖,如果合法则标记这个湖所覆盖的面。 由于一个面至多只能被一个湖所覆盖,因此这个算法显然是正确的。 下面我们讨论一下如何进行判断。 利用简单的floodfill 算法我们可以简单的判断出一个高度为hei 湖的“区域”: 1)对于一个面x ,y ,z ,如果h ≥hei ,则显然这个面是不可能在这个湖下方的;

文档评论(0)

1亿VIP精品文档

相关文档