1 条题解
-
0
- 题意理解 我们有:
个点,坐标 在矩形 到 内。
如果 ,称为西侧点。
如果 ,称为东侧点。
条边,有向或无向,除了在端点外不相交(即平面图)。
问题:对每个西侧点,求它能沿着边到达多少个东侧点。
输出时,按西侧点的 从大到小输出结果。
- 关键点分析 2.1 平面图性质 题目说“边在交点以外的任何地方不相交”,意味着这是一个平面图。 平面图的一个重要性质是:它的对偶图(或者某种定向)可以给出路径的偏序关系。
2.2 东西侧的特殊性 西侧点都在 上,东侧点都在 上。
矩形边界可能没有显式给出作为边,但图是画在矩形内的,所以西侧和东侧在某种意义上像是“源”和“汇”。
- 思路推导 这个问题等价于: 对每个西侧点 ,求东侧点的可达集合大小。
直接做 次 BFS/DFS 会超时( 可达 )。
3.1 平面图的可达性技巧 在平面图中,如果所有边不相交,那么我们可以利用“左右”关系来简化问题。
一个常见技巧:
把图的外边界看作一个环,西侧和东侧分别是环上的一段。
在平面图中,从西侧到东侧的路径会按照某种“从上到下”的顺序排列。
3.2 转化为“区间覆盖” 想象把矩形拉成一个长条,西侧在左,东侧在右。 平面图保证:如果我们按 坐标给西侧点编号 (从上到下),给东侧点编号 (从上到下),那么:
从 能到达的东侧点,在 序列中是一个连续区间。
为什么? 因为如果 能到达 和 (),那么它也能到达中间的 (),否则路径会交叉,违反平面图性质(Jordan曲线定理的一种形式)。
3.3 利用区间简化问题 因此,问题变成:
对每个西侧点 ,求它能到达的东侧点的区间 ,然后答案就是 。
3.4 如何求区间 我们可以用动态规划/记忆化搜索在平面图结构上递推:
把图拆成面(faces),利用平面图的对偶图。
另一种方法:按拓扑序处理(如果有向图无环),但这里可能有环(无向边),所以不能直接拓扑。
更实际的方法:
把无向边视为双向边。
从所有东侧点反向 BFS/DFS,标记能到达东侧点的节点。
但这样只能判断能否到达任意东侧点,不能得出区间。
为了得到区间,需要更精细的方法:
从上到下扫描西侧点,利用平面图路径不交叉的性质,维护当前能到达的东侧点的最小和最大索引。
3.5 具体算法(概念) 把西侧点按 降序排序,东侧点也按 降序排序,并编号。
构建图时,把无向边当作两条有向边。
用 BFS 或 DFS 从每个西侧点出发,但利用单调性优化: 如果 能到达的区间是 ,那么 (在它下面)的区间很可能与 有重叠,可以利用之前的信息。
实际上,可以一次 BFS 从所有西侧点开始,但给每个节点记录它能到达的东侧点的最小和最大编号(min-index, max-index),通过边更新。
由于是平面图,更新时不会出现矛盾(即不会出现交叉路径导致区间不连续)。
3.6 实现细节(不写代码,但描述) 初始化:每个东侧点 的区间是 ,西侧点初始区间为 。
用 BFS 或 DFS(或多次迭代,因为可能有环)来传播区间: 对边 ,用 的区间更新 的区间(取并集)。
因为无向边,要双向传播,但注意方向性:有向边只能沿方向传播。
迭代直到区间不再变化。
最后对每个西侧点,区间长度就是答案。
- 时间复杂度 每个点维护两个整数(min, max)。
更新时,如果区间扩大才继续传播。
最坏情况下每个边被激活 次,但平面图边数 ,区间大小不超过东侧点数,所以可接受。
实际可用 BFS 队列优化。
- 总结 核心思想:
利用平面图路径不交叉的性质,把可达集合变成连续区间。
通过 BFS/DFS 传播区间(min, max)来高效计算。
按 降序输出西侧点的结果。
这样就能在 的近似复杂度内解决问题,适用于大数据范围。
- 1
信息
- ID
- 4944
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者